深入浅出程序设计竞赛(基础篇)

第六章字符串

P5733 【深基6.例1】自动修正

P5733

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    string s;
    cin>>s;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]>='a'&&s[i]<='z')
           s[i]-='a'-'A';
    }
    cout<<s<<endl;
    return 0;
}

P1914 小书童——凯撒密码

P1914

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    int n;
    string s;
    cin>>n>>s;
    for(int i=0;i<s.size();i++)
    {
        s[i]=(s[i]-'a'+n)%26+'a';
        cout<<s[i];
    }
    return 0;
}

P1125 [NOIP2008 提高组] 笨小猴

P1125

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    string s;
    int ans[26]={0};
    int mmax=0,mmin=10000,delta;
    cin >> s;
    for(int i=0;i<s.size();i++)
       ans[s[i]-'a']++;
       
    for(int i=0;i<26;i++)
    {
        if(ans[i]>mmax)mmax=ans[i];
        if(ans[i]!=0&&ans[i]<mmin)mmin=ans[i];
    }
    delta=mmax-mmin;
    if(delta==0||delta==1)
    {
        printf("No Answer\n0\n");
        return 0;
    }
    
    for(int h=2;h*h<=delta;h++)
       if(delta%h==0)
       {
           printf("No Answer\n0\n");
       }
       
    cout << "Lucky Word"<<endl;
    cout<<mmax-mmin<<endl;
    return 0;
    
}

P5015 [NOIP2018 普及组] 标题统计

P5015

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    
    string s;
    int ans=0;
    while(cin>>s)
       ans+=s.size();
    cout << ans<<endl;
    return 0;
}

P5734 【深基6.例6】文字处理软件

P5734

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    int n,opt,l,r;
    string s,a;
    cin >> n>>s;
    while (n -- )
    {
        cin >> opt;
        if(opt==1)
        {
            cin >>a;
            s.append(a);
            cout<<s<<endl;
        }
        else if(opt==2)
        {
            cin>>l>>r;
            s=s.substr(l,r);
            cout << s<<endl;
        }
        else if(opt==3)
        {
            cin>>l>>a;
            s.insert(l,a);
            cout << s<<endl;
        }
        else 
        {
            cin >> a;
            cout << (int)s.find(a)<<endl;
        }
    }
    return 0;
}

P1308 [NOIP2011 普及组] 统计单词数

P1308

//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;

//常用的数组
int a[N],pre[N];

signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    string word,s;
    getline(cin,word);
    getline(cin,s);
    for(int i=0;i<word.size();i++)
        if(word[i]>='A'&&word[i]<='Z')
            word[i]+='a'-'A';
    for(int i=0;i<s.size();i++)
        if(s[i]>='A'&&s[i]<='Z')
            s[i]+='a'-'A';
    word=' '+word+' ';
    s=' '+s+' ';
    if(s.find(word)==-1)
        cout<<-1<<endl;
    else{
        int firstpos=s.find(word);
        int nextpos=s.find(word),cnt=0;
        while(nextpos!=-1)
        {
            cnt++;
            nextpos=s.find(word,nextpos+1);
        }
        cout<<cnt<<" "<<firstpos<<endl;
    }

    return 0;
}

第六章字符串习题

P1765 手机(map的经典应用)

P1765

#include<cstdio>
#include<map>
#include<cstring>
#include<iostream>
#include<string>
using namespace std;
map<char,int>ma;//定义map,把char类型转化成int
string word;
int ans=0;
void init()
{
    ma['a']=1;
    ma['b']=2;
    ma['c']=3;
    ma['d']=1;
    ma['e']=2;
    ma['f']=3;
    ma['g']=1;
    ma['h']=2;
    ma['i']=3;
    ma['j']=1;
    ma['k']=2;
    ma['l']=3;
    ma['m']=1;
    ma['n']=2;
    ma['o']=3;
    ma['p']=1;
    ma['q']=2;
    ma['r']=3;
    ma['s']=4;
    ma['t']=1;
    ma['u']=2;
    ma['v']=3;
    ma['w']=1;
    ma['x']=2;
    ma['y']=3;
    ma['z']=4;
    ma[' ']=1;
}
int main()
{
    init();
    getline(cin,word);//读入
    for(int i=0;i<word.length();i++)
    {
        ans+=ma[word[i]];
    }
    cout<<ans<<endl;
}

P3741 小果的键盘(用STL)

P3741

//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;

//常用的数组
int a[N],pre[N];

signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n,c=-1,cnt=0;
    string s,a="VK";
    cin>>n>>s;
    while (s.find(a,c+1)!=-1)
    {
        cnt++;
        int t=s.find(a,c+1);
        s[t]='T';
        s[t+1]='T';
        c=t;
    }
    for(int i=0;i<s.size()-1;i++)
    {
        string w="KK";
        string e="VV";
        if(s.find(w)!=-1)
        {
            cnt++;
            break;
        }
        if(s.find(e)!=-1)
        {
            cnt++;
            break;
        }
    }
    cout<<cnt;

    return 0;
}

P1321 单词覆盖还原

P1321

//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;

//常用的数组
int a[N],pre[N];
int ans,sum;
signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    string s;
    cin>>s;
    for(int i=0;i<=s.size();i++)
    {
        if(s[i]=='b'||s[i+1]=='o'||s[i+2]=='y')
            ans++;
    }
    for(int i=0;i<=s.size();i++)
        if(s[i]=='g'||s[i+1]=='i'||s[i+2]=='r'||s[i+3]=='l')
            sum++;
    cout<<ans<<endl;
    cout<<sum;

    return 0;
}

P1553 数字反转(升级版)

P1553

//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;

//常用的数组
int a[N],pre[N];
//反转函数,并去掉前导零
string reverse(string s)
{
    int zerocount=0;
    reverse(s.begin(),s.end());
    for(auto i:s)
        if(i==48)++zerocount;//统计前导零的个数
    else
        break;
    s.erase(s.begin(),s.begin()+zerocount);
    return (s!=""?s:"0");
}
//去掉后导零
string deleteTail(string s)
{
    int zerocount=0;
    for(int i=s.size()-1;i>=0;i--)
        if(s[i]==48)++zerocount;
    else
        break;
    s.erase(s.end()-zerocount,s.end());
    return (s!=""?s:"0");
}

signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    string s;
    cin>>s;
    if(s.back()=='%')
    {
        cout<<reverse(s.substr(0,s.size()-1))<<"%"<<endl;
        return 0;
    }
    for(auto i:s)
    {
        string left,right;
        if(i=='/')
        {
            left=s.substr(0,s.find("/"));
            right=s.substr(s.find("/")+1);
            cout<<reverse(left)<<"/"<< reverse(right)<<endl;
            return 0;
        }
        if(i=='.')
        {
            left=s.substr(0,s.find("."));
            right=s.substr(s.find(".")+1);
            cout<<reverse(left)<<"."<<deleteTail(reverse(right)) <<endl;
            return 0;
        }
    }
    cout<<reverse(s)<<endl;

    return 0;
}
//std::reverse(),顾名思义,用于反转序列。需要提供首尾迭代器作为参数。
//std::string::erase(),传入两个迭代器 l,r,清除[l,r)范围内的字符。
//std::string::substr(),用于提取子字符串,用法与前者类似。
//std::string::find(),用来查找字串在母串中第一次出现的位置。

P1603 斯诺登的密码

P1603

#include<iostream>
#include<algorithm>
using namespace std;
string yw[30]={"","one","two","three","four","five","six","seven",
               "eight","nine","ten","elven","twelve","thirteen","fourteen","fifteen",
               "sixteen","seventeen","eighteen","nineteen","twenty","a","both",
               "another","first","second","third"};
int sz[30]={0,1,4,9,16,25,36,49,64,81,0,21,44,69,96,25,56,89,24,61,0,
            1,4,1,1,4,9};
int k;
int a[10];

int main()
{
    for(int i=1;i<=6;i++)
    {
        string x;
        cin>>x;//直接用变量读就行了
        for(int j=1;j<=26;j++)//26种英文数字
            if(yw[j]==x)
            {a[++k]=sz[j];break;}//k记录有几个英文数字
    }
    if(k==0){cout<<0<<endl;return 0;}//先判断一下句子中有没有英文数字
    sort(a+1,a+k+1);//排序
    for(int i=1;i<=k;i++)
    {
        if(i!=1&&a[i]<10)cout<<0;//补0
        cout<<a[i];
    }
    cout<<endl;
    return 0;
}
//根据题目要求“组成一个新数,
//如果开头为0,就去0”,说明除了第一个,
//后面每个数如果只有一位都要在十位补上一个0

P1200 [USACO1.1] 你的飞碟在这儿 Your Ride Is Here

P1200

//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;

//常用的数组
int a[N],pre[N];
int ans=1,num=1;
signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    string a,b;
    cin>>a>>b;
    for(int i=0;i<a.size();i++)ans*=a[i]-64;
    for(int i=0;i<b.size();i++)num*=b[i]-64;
    ans%=47,num%=47;
    if(ans==num)cout<<"GO";
    else cout<<"STAY";
    return 0;
}

P1597 语句解析

P1597
法一map

//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;

//常用的数组
int a[N],pre[N];
map<char,int>num;
signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    string s;
    cin>>s;
    num['a']=num['b']=num['c']='0';
    for(int i=0;i<s.size();i+=5)
        if(s[i+3]>='0'&&s[i+3]<='9')
            num[s[i]]=s[i+3];
        else
            num[s[i]]=num[s[i+3]];
    printf("%c %c %c",num['a'],num['b'],num['c']);

    return 0;
}

第七章函数与结构体

P5735 【深基7.例1】距离函数

P5735

//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;

//常用的数组
int a[N],pre[N];
double sq(double x)
{
    return x*x;
}
double dist(double x1,double y1,double x2,double y2)
{
    return sqrt(sq(x1-x2)+sq(y1-y2));
}
signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    double x1,y1,x2,y2,x3,y3,ans;
    cin>>x1>>y1>>x2>>y2>>x3>>y3;
    ans=dist(x1,y1,x2,y2);
    ans+=dist(x1,y1,x3,y3);
    ans+=dist(x2,y2,x3,y3);
    printf("%.2lf",ans);

    return 0;
}

P5736 【深基7.例2】质数筛

P5736

//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;

//常用的数组
int a[N],pre[N];
int n;
bool is_prime(int x)
{
    if(x==0||x==1)return 0;//0和1不是质数,需要特判
    for(int i=2;i*i<=x;i++)
        if(x%i==0)
            return 0;
    return 1;//如果是质数,则返回1,否则返回0
}
signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    for(int i=0;i<n;i++)
        if(is_prime(a[i]))
            cout<<a[i]<<" ";
    cout<<endl;

    return 0;
}

P5737 【深基7.例3】闰年展示

P5737

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 3010;
int a[N];
int cnt=0;
int ans;

int main()
{
    int l,r;
    cin>>l>>r;
    for(int i=l;i<=r;i++)
    {
        if((i%4==0&&i%100!=0)||i%400==0)
        {
            a[cnt++]=i;
            ans++;
        }
    }
    cout<<ans<<endl;
    for(int i=0;i<cnt;i++)
    cout<<a[i]<<" ";
}

P5738 【深基7.例4】歌唱比赛

P5738

//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;

//常用的数组
int a[N],pre[N];
int s[25],n,m,maxsum;
void stat(int a[],int m)
{
    int maxscore=0,minscore=10,sum=0;
    for(int i=0;i<m;i++)
    {
        maxscore=max(a[i],maxscore);
        minscore=min(a[i],minscore);
        sum+=a[i];
    }
    maxsum=max(maxsum,sum-maxscore-minscore);//记录剩下的n-2评分总和
}
signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=0;i<n;i++) {
        for (int j = 0; j < m; j++)
            cin >> s[j];
        stat(s, m);
    }
    printf("%.2f",double(maxsum)/(m-2));

    return 0;
}

P5733 【深基6.例1】自动修正

P5733

//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;

//常用的数组
int a[N],pre[N];
string to_upper(string s)
{
    for(int i=0;i<s.size();i++)
        if(s[i]>='a'&&s[i]<='z')
            s[i]-=32;
    return s;
}
signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    string s1,s2;
    getline(cin,s1);
    s2=to_upper(s1);
    cout<<s2<<endl;
    return 0;
}

P5739 【深基7.例7】计算阶乘

P5739

//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
 
using namespace std;
 
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
 
//常用的数组
int a[N],pre[N];
int f(int x)
{
    if(x==1)return 1;
    return x*f(x-1);
}
signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n;
    cin>>n;
    cout<<f(n)<<endl;
    
    return 0;
}

P5740 【深基7.例9】最厉害的学生

P5740

#include <bits/stdc++.h>
#define int long long //(有超时风险)
#define PII pair<int,int>
#define endl '\n'
#define LL __int128
 
using namespace std;
 
const int N=2e5+10,M=1e3+10,mod=998244353,INF=0x3f3f3f3f;
 
int a[N],pre[N];

struct Node
{
    string name;
    int chinese,math,eng,sum;
    int idx;//编号
}stu[N];

bool cmp(Node a,Node b)//自定义比较函数
{
    if(a.sum!=b.sum)
    {return a.sum>b.sum;//return这个表达式的返回值,大于是1
    //相当于if(a.sum>b.sum)
            //   return true;
            // else 
            //   return false;
    }
    else if(a.idx!=b.idx)
    {
        return a.idx<b.idx;
    }  
}

signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
 
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        string name;
        cin>>name;
        int x,y,z;
        cin>>x>>y>>z;
        stu[i]={name,x,y,z,x+y+z,i};
    }
    sort(stu+1,stu+n+1,cmp);
    cout<<stu[1].name<<' '<<stu[1].chinese<<' '<<stu[1].math<<' '<<stu[1].eng;
    return 0;
}

P5741 【深基7.例10】旗鼓相当的对手 - 加强版

P5741

//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=1e4,M=1e3+10;

//常用的数组

int n,x,ans;
struct student_t_distribution{
    string name;
    int chinese,math,english;
}a[N];
bool check(int x,int y,int z)
{
    return x<=y+z&&y<=x+z;
}
signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].name>>a[i].chinese>>a[i].math>>a[i].english;
    }
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            if(check(a[i].chinese,a[j].chinese,5)&&check(a[i].math,a[j].math,5)&&check(a[i].english,a[j].english,5)&& check(a[i].chinese+a[i].math+a[i].english,a[j].chinese+a[j].math+a[j].english,10))
                cout<<a[i].name<<" "<<a[j].name<<endl;

    return 0;
}

P5742 【深基7.例11】评等级

P5742

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int N = 1024;

struct node {
    int id;//学号
    double sc1, sc2;//学业成绩和素质拓展成绩
    int score;//学业成绩和素质拓展成绩的和
    double final_score;//综合分数
}a[N];//结构体定义,由于本人习惯(懒),sc1和sc2定义成了double。
int main() {
    int n;
    cin >> n;
    for(int i=0; i<n; i++) {
        cin >> a[i].id >> a[i].sc1 >> a[i].sc2;
        a[i].score = a[i].sc1 + a[i].sc2;
        a[i].final_score = a[i].sc1 * 0.7 + a[i].sc2 * 0.3;//计算综合分数
    }
    for(int i=0; i<n; i++) {
        if(a[i].score > 140 && a[i].final_score >= 80) {//一定看清题
            cout << "Excellent" << endl;
        }
        else {
            cout << "Not excellent" << endl;
        }
    }
    return 0;
}

第7章函数与结构体课后习题

P1075 [NOIP2012 普及组] 质因数分解

P1075

//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
bool is_prime(int x)
{
    if(x<2)return 0;
    for(int i=2;i<=sqrt(x);i++)
        if(x%i==0)return 0;
    return 1;
}
//常用的数组
int a[N],pre[N];
int cnt=0;
signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int m,w,q;
    cin>>m;
    for(int i=2;i<sqrt(m);i++)
        if(is_prime(i)==1&&m%i==0&&is_prime(m/i)==1){
            cout<<m/i<<endl;
            return 0;
        }


    return 0;
}

P1304 哥德巴赫猜想

P1304

//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
bool is_prime(int x)
{
    if(x<2)return 0;
    for(int i=2;i<=sqrt(x);i++)
        if(x%i==0)return 0;
    return 1;
}
//常用的数组
int n,s;
int cnt=0;
signed main(){
    int i,j;
    cin>>n;//读入
    for (i=4;i<=n;i++)//从4到n扫
        for (j=2;j<=i/2;j++)//因为1不是质数,不用考虑,一直到i的一半就可以了,不然i一减就重复了
            if (i%2!=0) break;//因为哥德巴赫猜想是说大于4的偶数,如果i是奇数就弹了
            else if (is_prime(j)&&is_prime(i-j)) {cout<<i<<"="<<j<<"+"<<i-j<<endl;break;}//其实没必要写else,因为如果不行的已经弹了,现在的i一定是偶数并且j和i-j都是质数的话就输出,再弹出这个循环
    return 0;
}

第八章模拟与高精度

P1009 [NOIP1998 普及组] 阶乘之和

P1009

//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128

using namespace std;

//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;

//常用的数组
int a[N],pre[N];
int n;
vector<int>mul(vector<int>&a,int b)//模拟乘法
{
    vector<int>c;
    int t=0;
    for(int i=0;i<a.size()||t;i++)
    {
        if(i<a.size())t+=a[i]*b;
        c.push_back(t%10);
        t/=10;
    }
    while(c.size()>1&&c.back()==0)c.pop_back();
    return c;
}
//mul 函数实现了大整数的乘法运算,接受一个大整数向量 a 和一个整数 b,返回它们的乘积。具体步骤如下:
//定义一个空向量 c 用来存储乘积结果。
//使用变量 t 来保存进位值,初始化为 0。
//遍历大整数向量 a,同时将当前位与整数 b 相乘,并加上进位值 t。
//将乘积结果的个位数加入向量 c 中,并更新进位值 t。
//如果遍历完 a 后,仍然存在进位值 t,则将其加入向量 c 中。
//最后去除结果向量 c 中末尾的多余零,并返回结果向量 c。
vector<int>add(vector<int>&a,vector<int>&b)//模拟加法
{
    if(a.size()<b.size())return add(b,a);
    vector<int>c;
    int t=0;
    for(int i=0;i<a.size();i++)
    {
        t+=a[i];
        if(i<b.size())t+=b[i];
        c.push_back(t%10);
        t/=10;
    }
    if(t)
    {
        c.push_back(t);
    }
    return c;
}
//add 函数实现了大整数的加法运算,接受两个大整数向量 a 和 b,返回它们的和。具体步骤如下:
//确保 a 的长度不小于 b 的长度,如果不是,则交换 a 和 b。
//定义一个空向量 c 用来存储相加结果。
//使用变量 t 来保存进位值,初始化为 0。
//遍历大整数向量 a,同时将当前位与 b 对应位置的位相加,并加上进位值 t。
//将相加结果的个位数加入向量 c 中,并更新进位值 t。
//如果遍历完 a 后,仍然存在 b 中未处理的位,则将其与进位值相加,并将结果加入向量 c 中。
//如果遍历完 a 和 b 后,仍然存在进位值 t,则将其加入向量 c 中。
//返回结果向量 c。
signed main()
{
    //关掉流同步,cin变快,但是不能用scanf,可以用printf;
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n;
    vector<int>a;
    a.push_back(1);
    vector<int>res,pri;
    res.push_back(0);
    pri.push_back(1);
    for(int b=1;b<=n;b++)//模拟阶乘
    {
        pri=mul(pri,b);
        res=add(res,pri);
//        for(auto c:pri)cout<<c;
//        cout<<" ";
//        for(auto c:res)cout<<c;
//        cout<<endl;
    }
    for(int i=res.size()-1;i>=0;i--)
    {
        cout<<res[i];
    }
    cout<<endl;
    return 0;
}
//初始化向量 a 为 {1},表示初始的阶乘结果为 1。
//初始化向量 res 和 pri 为 {0} 和 {1},分别表示阶乘之和的结果和当前计算的阶乘结果。
//使用循环计算从 1 到 n 的阶乘之和,每次迭代都更新 pri 为当前阶乘值,并将其与 res 相加得到新的阶乘之和。
//最后输出计算得到的阶乘之和。
  • 34
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《洛谷深入浅出程序设计竞赛(基础篇) pdf》是一本关于程序设计竞赛基础知识的书籍,主要面向初学者。本书作者通过深入浅出的方式,以简洁清晰的语言讲解了程序设计竞赛中常见的基础知识和技巧。 该书首先介绍了算法和数据结构的基本概念,包括常见的排序算法、栈、队列、链表、树等数据结构。然后,详细讲解了常用的算法设计技巧,如贪心算法、动态规划、递归等,并通过大量的例题进行了实践演练,使读者能更好地理解和掌握这些技巧。 此外,本书还介绍了常见的编程语言和开发环境,如C++、Python和Java等,并提供了一些常用的程序调试技巧和工具,帮助读者解决实际编程过程中可能遇到的问题。 《洛谷深入浅出程序设计竞赛(基础篇) pdf》还包含了大量的习题和实例,供读者进行练习和巩固所学知识。同时,书中还提供了一些实战经验和竞赛技巧,帮助读者提高在程序设计竞赛中的表现。 总的来说,《洛谷深入浅出程序设计竞赛(基础篇) pdf》适合初学者入门,内容全面、易懂,对于想要了解程序设计竞赛基础知识和提升编程能力的人来说是一本很好的参考书。 ### 回答2: 《洛谷深入浅出程序设计竞赛(基础篇) pdf》是一本内容丰富、有助于初学者提高编程能力的书籍。该书主要介绍了洛谷这个在线判题系统的使用方法以及一些常见的算法和数据结构知识。 首先,书中详细介绍了洛谷这个在线判题系统的功能和使用方法。洛谷是一个非常受欢迎的在线编程平台,它提供了丰富的题目和在线编译环境,使得用户可以更加方便地练习和学习编程。书中通过简单明了的语言和图文并茂的示例,向读者介绍了洛谷的登录、题目搜索、代码提交等基本操作,帮助读者迅速上手这个平台。 其次,书中系统地介绍了一些常见的算法和数据结构知识。这对于初学者来说,是非常重要的一部分。书中通过具体的例子和详细的讲解,向读者介绍了一些常见的算法,如搜索、排序和动态规划等。同时,书中还提供了一些实操编程题目,使得读者可以通过练习加深对这些算法的理解和掌握。 总的来说,《洛谷深入浅出程序设计竞赛(基础篇) pdf》是一本对于初学者来说非常有价值的书籍。它通过详细的介绍洛谷系统的使用方法和常见算法的讲解,帮助读者快速入门,并且提高编程能力。阅读这本书,不仅可以帮助初学者更好地了解和使用洛谷系统,还可以提供一些常见算法的思路和实践经验,对于参加编程竞赛和提升编程能力有着积极的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值