PAT乙级题解31-60

31

#include<bits/stdc++.h>
using namespace std;
char z[11]={'1','0','X','9','8','7','6','5','4','3','2'};//校验位
int weight[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};      //权重
bool check(string &str){                        //检查是否合理的函数
    bool ret=true;
    int i=0,sum=0;
    for(i=0;i<17;i++){                          
        if(str[i]>='0'&&str[i]<='9')            //如果是数字累加计算
            sum+=(str[i]-'0')*weight[i];
        else{   
            ret=false;break;                    //如果前17位中出现非数字,则不合理
        }
    }
    if(str[17]!=z[sum%11]) ret=false;           //如果校验位出错,也认为不合理
    return ret;
}
int main(){
    int n,cnt=0;
    string str;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        cin>>str;
        if(check(str)==false){                  //对每一个进行判定,如果不合理则输出
            cnt++;
            cout<<str<<endl;
        }
    }
    if(cnt==0) cout<<"All passed";
    return 0;
}

32

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,maxid,maxsore=-1;             //记录做高学校的编号和分数,最高分数初始化为-1
    map<int,int> mp;                    //用于统计不同学校的分数,第一参数为学校编号,第二个为分数
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int id,score;
        scanf("%d%d",&id,&score);
        mp[id]+=score;                  //累加学校的分数
        if(mp[id]>maxsore){             //如果有最高分出现,则更新参数
            maxid=id; maxsore=mp[id];
        }
    }
    printf("%d %d",maxid,maxsore);      //输出结果
    return 0;
}

33

#include<bits/stdc++.h>
using namespace std;
int main(){
    char ch;
    int cnt=0;
    map<char,int> mp;                       //使用map标记是否是坏键,如果是,标记为1(不能标记为0,不然mp[]会默认添加一组键值,初始化为0)
    while((ch=getchar())!='\n'){
        if(ch>='A'&&ch<='Z') ch=ch-'A'+'a'; //转化为小写统计
        mp[ch]=1;
    }
    while((ch=getchar())!='\n'){
        if(ch>='A'&&ch<='Z')                //大写需要特判,如果字符键和换挡键有任意一个损坏,则不可输出
            if(mp[ch-'A'+'a']==1||mp['+']==1) continue;
        if(mp[ch]==1) continue;
        else{                               //如果没坏则输出结果
            putchar(ch);
            cnt++;
        }
    }
    if(cnt==0) putchar('\n');               //如果没有输出一个字符,打印空行
    return 0;
}

34

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){                          //求公约数
    return !b?a:gcd(b,a%b);
}
void Print_fen(ll a,ll b){                  //打印分数
    if(a*b==0){                             //特判
        printf("%s",b==0?"Inf":"0");        //如果分子是0,打印0,如果分母是0打印Inf
        return;
    }
    bool fu=(a<0&&b>0)||(a>0&&b<0);         //确定符号
    a=abs(a);b=abs(b);                      //分子分母取绝对值
    ll zheng=a/b;                           //如果是假分数,先计算整数部分
    if(fu) printf("(-");                    //如果是负数,打印括号和负号
    if(zheng!=0)printf("%lld",zheng);       //输出整数部分
    if(a%b){                                //如果有分数部分
        if(zheng!=0) putchar(' ');          //如果同时又整数部分和分数部分,打印空格
        a%=b;                               //对a取余,由于通分采用辗转相除法求公约数,所以取余有助于减少循环次数
        ll tmp=gcd(a,b);                    //计算分子分母的公约数
        a/=tmp;b/=tmp;                      //约分并输出结果
        printf("%lld/%lld",a,b);            //打印结果
    }
    if(fu) putchar(')');                    //如果是负数,补充括号
}
int main(){
    ll a,b,c,d;
    scanf("%lld/%lld %lld/%lld",&a,&b,&c,&d);           //读入两个分数的分子分母
    //分别输出四种计算
    Print_fen(a,b);printf(" + ");Print_fen(c,d);printf(" = ");Print_fen(a*d+b*c,b*d);putchar('\n');
    Print_fen(a,b);printf(" - ");Print_fen(c,d);printf(" = ");Print_fen(a*d-b*c,b*d);putchar('\n');
    Print_fen(a,b);printf(" * ");Print_fen(c,d);printf(" = ");Print_fen(a*c,b*d);putchar('\n');
    Print_fen(a,b);printf(" / ");Print_fen(c,d);printf(" = ");Print_fen(a*d,b*c);putchar('\n');
    return 0;
}

35

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a[100],mid[100];
    int n,i,j;
    cin>>n;
    for(i=0;i<n;i++)            //读入初始序列 
        cin>>a[i];
    for(i=0;i<n;i++)            //读入中间序列 
        cin>>mid[i];
    for(i=0;i<n-1;i++){         //找到中间序列中前部分已排序列的下一个元素 ,并用j记录下标 
        if(mid[i+1]<mid[i]){
            j=i+1;break;
        }    
    }
    for(j;j<n;j++)              //如果中间序列从j开始往后都与输入序列相同,则说明前面部分的有序序列是插入排序 
        if(a[j]!=mid[j]) break;
    if(j==n){                   //如果是插入排序,将j标记的元素插入到已排序列
        cout<<"Insertion Sort"<<'\n';           //可以直接用sort从a开始到j标记的下一个元素进行排序,sort排序的参数左闭右开 
        sort(a,a+i+2);
    }
    else{                       //如果不是插入排序就是归并排序,手动模拟,每一步排序过程,直到与中间序列匹配,再排一次并输出; 
        cout<<"Merge Sort"<<'\n'; 
        int k=1,flag=1;         //用k来表示归并每组的元素个数,初始为1,每次×2;flag标记是否匹配,如果匹配则不在归并排序 
        while(flag){
            flag=0;             //初始化标记
            for(i=0;i<n;i++)    //对中间序列进行匹配,如果不匹配,则将flag置为1,使排序继续进行一个轮次
                if(a[i]!=mid[i]) { flag=1; break; }//※※※》注意》 把匹配放在前边以便于检查初始序列,而且,如果匹配得到,循环下部分还能继续一轮排序,最后可以输出 
            k=k*2;             //分组内元素个数乘2 
            for(i=0;i<n/k;i++)//遍历数组,对每各组进行组归并,元素个数少,直接sort排序就行, 
                sort(a+i*k,a+(i+1)*k);
            sort(a+n/k*k,a+n);//如果不能刚好分为整数组,会有最后一组不满足k个元素,单独对最后剩余的元素排序,n/k表示的分组个数 
        }
    }
    for(i=0;i<n;i++){           //最后输出中间序列继续一轮排序的结果 
        if(i) putchar(' ');
        printf("%d",a[i]);
    }    
    return 0;
}

36

#include<bits/stdc++.h>
using namespace std;
void Print_ch(char ch,int n){
    for(int i=0;i<n;i++)
        putchar(ch);
}
int main(){
    int hang,lie;
    char ch;
    scanf("%d %c",&lie,&ch);
    hang=lie%2==0?lie/2:(lie+2)/2;  //如果是偶数直接除以2,如果是奇数,四舍五入取整
    for(int i=0;i<hang;i++){
        if(i==0||i==hang-1)         //第一行和最后一行打满字符
            Print_ch(ch,lie);
        else{                       //中间行只开头结尾打印
            putchar(ch);
            Print_ch(' ',lie-2);
            putchar(ch);
        }
        putchar('\n');
    }
    return 0;
}

37

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll a,b,c,a1,b1,c1;
    ll P,A;
    scanf("%lld.%lld.%lld %lld.%lld.%lld",&a,&b,&c,&a1,&b1,&c1);
    P=a*17*29+b*29+c;                                   //读入并计算价格
    A=a1*17*29+b1*29+c1;
    if(A<P){                                            //判负
        swap(A,P); putchar('-');
    }
    A-=P;                                               //计算最后输出结果
    printf("%lld.%lld.%lld",A/(17*29),A/29%17,A%29);    //格式化输出
    return 0;
}

38

#include<bits/stdc++.h>
using namespace std;
int main(){
    int cnt[101]={0};               //统计分数,百分制,数组开到101个即可
    int n,score;
    scanf("%d",&n);                 //读入n个成绩并计数
    for(int i=0;i<n;i++){
        scanf("%d",&score);
        cnt[score]++;
    }
    scanf("%d",&n);                 //读取查询个数
    for(int i=0;i<n;i++){           //查询输出,并控制格式
        if(i) putchar(' ');
        scanf("%d",&score);
        printf("%d",cnt[score]);
    }
    return 0;
}

39

#include<bits/stdc++.h>
using namespace std;
int main(){
    string str1,str2;
    map<char,int> have,need;                            //统计已有的数量和需求的数量
    int neednum=0,flag=1;                               //统计不足时候的需求量,flag表示是否可以购买
    cin>>str1>>str2;
    for(int i=0;i<str1.size();i++)                      //分别统计
        have[str1[i]]++;
    for(int i=0;i<str2.size();i++)
        need[str2[i]]++;
    for(auto it=need.begin();it!=need.end();it++){      //遍历需求
        if(have[it->first]<it->second){
            flag=0; neednum+=it->second-have[it->first];//如果某种颜色不足,修改标记,统计不足时候的需求量
        } 
    }
    if(flag) printf("Yes %d",str1.size()-str2.size());  //根据标记按照要求输出结果
    else printf("No %d",neednum);
    return 0;
}

40

#include<bits/stdc++.h>
#define NN 1000000007
using namespace std;
int main(){
    int Pcnt=0,Tcnt=0,n=0,cnt=0;
    char str[100005]={0},ch;
    while((ch=getchar())!='\n'){                    //读入字符串,并统计T的个数
        if(ch=='T') Tcnt++;
        str[n++]=ch;
    }
    for(int i=0;i<n;i++){                           //遍历字符串
        switch(str[i]){
            case 'P':Pcnt++;break;                  //统计每一个A左侧P的个数
            case 'T':Tcnt--;break;                  //统计每一个A右侧T的个数
            case 'A':cnt+=Pcnt*Tcnt; cnt%=NN;break; //根据排列组合,每一个A可以和左侧的P和右侧的T组合成一个PAT,因此计数相乘并统计累加,然后按照要求取余数
        }
    }
    printf("%d",cnt);                               //输出结果
    return 0;
}

41

#include<bits/stdc++.h>
using namespace std;
typedef struct student{                     //学生信息结构体,准考证号和考试座位号
    string id;
    int num;
}STU;
int main(){
    map<int,STU> mp;                        //建立机试座位号和学生信息的对应关系
    int n,tmp;
    STU temp;
    scanf("%d",&n);
    for(int i=0;i<n;i++){                   //读入学生信息
        cin>>temp.id>>tmp>>temp.num;
        mp[tmp]=temp;
    }
    scanf("%d",&n);
    for(int i=0;i<n;i++){                   //按照查询输出学生信息
        scanf("%d",&tmp);
        cout<<mp[tmp].id<<' '<<mp[tmp].num<<endl;
    }
    return 0;
}

42

#include<bits/stdc++.h>
using namespace std;
int main(){
    int maxnum=-1,cnt[26]={0},id; 
    char ch;                       
    while((ch=getchar())!='\n'){
        if(isalpha(ch)==false) continue;            //非字母不加入统计
        if(ch>='A'&&ch<='Z') ch=ch-'A'+'a';         //转换为小写
        id=ch-'a';                                  //映射到计数表的数组下标
        cnt[id]++;
        maxnum=cnt[id]>maxnum?cnt[id]:maxnum;       //记录最大值
    }
    for(int i=0;i<26;i++)                           //从字母序小到大第一个出现次数最多的输出打印
        if(cnt[i]==maxnum){
            printf("%c %d",'a'+i,maxnum); break;
        }
    return 0;
}

43

#include<bits/stdc++.h>
using namespace std;
int main(){
    int cnt[6]={0},flag=1;              //统计每种字符的个数
    char ch,Table[]="PATest";
    while((ch=getchar())!='\n'){
        switch(ch){
            case 'P':cnt[0]++;break;
            case 'A':cnt[1]++;break;
            case 'T':cnt[2]++;break;
            case 'e':cnt[3]++;break;
            case 's':cnt[4]++;break;
            case 't':cnt[5]++;break;
        }
    }
    while(flag){                        //当标记为1时循环
        flag=0;                         //初始化为0,如果还有字符剩余,修改标记为1
        for(int i=0;i<6;i++){
            if(cnt[i]>0){               //输出存在的字符
                putchar(Table[i]);
                if(cnt[i]--) flag=1;    //如果字符剩余不为0,修改标记
            } 
        }
    }
    return 0;
}

44

#include<bits/stdc++.h>
using namespace std;
string High[]={"","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
string Low[]={"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
void MtoE(string &str){                             //火星文转地球数字
    int num=0;
    if(str.size()<5){                               //字符串小于五个的 小于13或者时13的整数倍(整数倍只有高位,没有低位的0)
        for(int i=0;i<13;i++)                       //小于13的
            if(Low[i]==str) { num=i; break; }
        for(int i=0;i<13;i++)                       //只有高位的13的整倍数
            if(High[i]==str) { num=i*13; break; }
    }
    else{                                           //字符串大于5个的,一定是有低位和高位
        string high=str.substr(0,3);                //取高位
        string low=str.substr(4,str.size()-4);      //取低位
        for(int i=0;i<13;i++){                      //计算结果
            if(low==Low[i]) num+=i;
            if(high==High[i]) num+=13*i;
        }
    }
    printf("%d\n",num);
}  
void EtoM(string &str){
    int num;
    sscanf(str.c_str(),"%d",&num);                  //字符串转为数字
    if(num>=13){                                    //对于超过13的
        cout<<High[num/13];                         //输出高位
        if(num%13){ putchar(' '); cout<<Low[num%13]<<endl; }    //如果不是13整倍数,输出空格和低位
        else putchar('\n');                         //如果是整倍数,输出换行
    }
    else                                            //小于13的直接输出
        cout<<Low[num%13]<<endl;         
} 
int main(){
    int n;
    string temp;
    scanf("%d\n",&n);
    for(int i=0;i<n;i++){                           //读入数据根据第一位判断字符是火星文,数字是地球数
        getline(cin,temp);
        if(isalpha(temp[0])) MtoE(temp);
        else EtoM(temp);
    }
    return 0;
}

45

解法一

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,max=0;
    cin>>n;
    vector<int> a(n),b(n),out;
    for(int i=0;i<n;i++){
        cin>>a[i];
        b[i]=a[i];
    }
    sort(b.begin(),b.end());
    for(int i=0;i<n;i++){
        if(a[i]==b[i]&&a[i]>max)
            out.push_back(a[i]);
        max=a[i]>max?a[i]:max;
    }
    cout<<out.size()<<endl;
    for(int i=0;i<out.size();i++){
        if(i) putchar(' ');
        cout<<out[i];
    }
    putchar('\n');                  //没有换行则会有格式错误
    return 0;
}

解法二

//使用数组的方式存储,时间会节省一半
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,max=0,cnt=0;
    scanf("%d",&n);
    int* a=(int*)malloc(sizeof(int)*n);         //a用于存储原始序列
    int* b=(int*)malloc(sizeof(int)*n);         //b用于存储排序后的序列
    for(int i=0;i<n;i++){                       //读取数据
        scanf("%d",&a[i]);
        b[i]=a[i];
    }
    sort(b,b+n);                                //对b进行排序
    for(int i=0;i<n;i++){                       
        if(a[i]==b[i]&&a[i]>max)                //遍历原始序列,如果当前元素刚好在排好之后的位置上,且都大于左侧的值(题目中所有数据不相同,所以大于左侧,一定都小于右侧)
            a[cnt++]=a[i];                      //满足这样的主元要求,则进行保存,这里为了节省空间,直接把需要输出的结果覆盖更新保存在a中
        max=a[i]>max?a[i]:max;
    }
    cout<<cnt<<endl;                            //输出结果
    for(int i=0;i<cnt;i++){
        if(i) putchar(' ');
        cout<<a[i];
    }
    putchar('\n');                              //没有换行则测试点2会有格式错误(很迷的测试点,所以建议将来所有的输出最后都多一个换行)
    return 0;
}

46

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,jia,jia1,yi,yi1;
    int jia_cnt=0,yi_cnt=0;                     //计数器
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d%d%d",&jia,&jia1,&yi,&yi1);
        int temp=jia+yi;
        if(jia1==temp&&yi1==temp) continue;     //如果平局则继续下一轮
        else if(jia1==temp) yi_cnt++;           //如果甲赢了,乙喝酒
        else if(yi1==temp) jia_cnt++;           //如果乙赢了,甲喝酒
    }
    printf("%d %d",jia_cnt,yi_cnt);             //输出结果
    return 0;
}

47

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,maxid,maxscore=0;
    int cnt[1001]={0};                          //记录每一队得分数
    scanf("%d\n",&n);
    for(int i=0;i<n;i++){
        int id,num,score;
        scanf("%d-%d %d\n",&id,&num,&score);    //读入分数
        cnt[id]+=score;                         //统计累加
        if(cnt[id]>maxscore){                   //更新最高成绩和队伍编号
            maxid=id; maxscore=cnt[id];
        }
    }
    printf("%d %d",maxid,maxscore);             //输出结果
    return 0;
}

48

#include<bits/stdc++.h>
using namespace std;
int main(){
    string strA,strB;
    cin>>strA>>strB;
    reverse(strA.begin(),strA.end());                   //将两个字符串逆序
    reverse(strB.begin(),strB.end());
    int len=strB.size()-strA.size();                    //对较短的字符串补充0(此题最终输出的位数为最长的字符串位数)
    if(len>0)   for(int i=0;i<len;i++)  strA+='0';
    else        for(int i=0;i<-len;i++)  strB+='0';
    for(int i=0;i<strB.size();i++){
        int tmp=0;
        if((i+1)%2==1){                                     //奇数位处理
            tmp=strA[i]-'0'+strB[i]-'0';
            tmp%=13;
            switch(tmp){
                case 10:strB[i]='J';break;
                case 11:strB[i]='Q';break;
                case 12:strB[i]='K';break;
                default:strB[i]='0'+tmp;break;
            }
        }
        else{                                               //处理偶数位
            tmp=strB[i]-strA[i];
            if(tmp<0) tmp+=10;
            strB[i]='0'+tmp;
        }
    }
    reverse(strB.begin(),strB.end());                       //结果逆置后输出最后结果
    cout<<strB;
    return 0;
}

49

#include<bits/stdc++.h>
using namespace std;
int main(){
    long double sum=0.0;
    long double temp;
    int i,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%Lf",&temp);     //将数列片段每组一行,统计发现每一个数字的个数规律,累加计算
        sum+=temp*(n-(i-1))*i;  //把temp写在前边,保证每一步的乘法都是long double运算 (更新了数据,测试点2的数值范围较大)
    }
    printf("%.2Lf",sum);
    return 0;
}
//long double 的读入和输出都要LF才能打到要求的精度

50

#include<bits/stdc++.h>
using namespace std;
const int maxn=10010;
//坐标运动的四种模式,按照向下为x轴正向,向右为y轴正向建立坐标系
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};    //0表示坐标向右移动,1表示坐标向下移动,2表示向左移动,3表示向上移动
int main(){
    int n,a[maxn]={0};
    int hang,lie;                       //需要输出的行数和列数
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    sort(a+1,a+1+n);                    //从小到大排序,然后从后往前开始遍历填充螺旋数组
    lie=int(sqrt(1.0*n));               //行数和列数一定等于开方数或者分布在开方数的两侧,小的那个一是列,大的那个是行
    for(int i=lie;i>=0;i--){            //计算行列数
        if(n%i==0){
            lie=i,hang=n/i;break;
        }
    }  
    //创建一个行数和列数都大一圈的数组空间用于填充数据,used数组用于标记某个位置是否已填充,作为坐标变换的判断边界之一
    int num[hang+1][lie+1]={0},used[hang+1][lie+1]={0};   //****两个数组最好手动初始化一下,有时候编译器可能不会自动初始化,容易出错
    int x=1,y=1,M=0;                    //坐标从(1,1)开始,第一步都是向右移动坐标,M代表移动模式
    while(n){                           //完成n个数据的填充
        num[x][y]=a[n];                 //填充当前坐标
        used[x][y]=1;                   //更新标记
        if(x+dx[M]<1||x+dx[M]>hang||y+dy[M]<1||y+dy[M]>lie||used[x+dx[M]][y+dy[M]])
            M=(M+1)%4;                  //如果x到达最外层或者y到达最外层边界,或者填充碰到了已填充的外层,则变更坐标移动方式
        x+=dx[M],y+=dy[M];              //产生下一组坐标
        n--;                            //更新计数器
    }
    for(int i=1;i<=hang;i++){           //输出结果
        for(int j=1;j<=lie;j++){
            if(j!=1) putchar(' ');
            printf("%d",num[i][j]);
        }
        putchar('\n');
    }
    return 0;
}

51

#include<bits/stdc++.h>
using namespace std;
int main(){
    double r1,p1,r2,p2;
    double a1,b1,a2,b2,a,b;
    scanf("%lf %lf %lf %lf",&r1,&p1,&r2,&p2);
    a1=r1*cos(p1);b1=r1*sin(p1);    //转化成常规的负数表示方法
    a2=r2*cos(p2);b2=r2*sin(p2);
    a=a1*a2-b1*b2; b=a1*b2+a2*b1;   //负数计算
    if(a>-0.005&&a<0) a=0;          //当a或者b大于-0.005的时候,比如-0.004由于四舍五入,变成-0.00,输出的仍然是负号,但是0应该输出+,需要提前处理
    if(b>-0.005&&b<0) b=0;
    printf("%.2f%+.2fi",a,b);       //+.2f  用于控制显示正负号,并且保留两位小数
    return 0;
}

52

#include<bits/stdc++.h>
using namespace std;
const int NUM=5;
void getemoj(vector<string> &emoj){
    char ch;
    string str;
    while(1){
        ch=getchar();
        if(ch=='\n')   return;                  //读取到换行符,说明该类型的表情已经读取完毕
        else if(ch=='[') str="";                //如果读到左括号,清空临时字符串,准备接受一个表情
        else if(ch==']') emoj.push_back(str);   //如果读到右括号,表明str中已经存储了一个表情,记录到数组中
        else str+=ch;                           //读取的字符串累加(由于表情用括号包起来,所以多余的会被清空,这里可能直接掠过其他字符)
    }
}
int main(){
    vector<string> emojs[3];
    for(int i=0;i<3;i++) getemoj(emojs[i]);     //获取表情
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int a,b,c,d,e;
        scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);//读入数据,并判断数据的合法性
        if(max(a,e)>emojs[0].size()||max(b,d)>emojs[1].size()||c>emojs[2].size()||min(a,e)<1||min(b,d)<1||c<1)
            printf("Are you kidding me? @\\/@");
        else                                    //输出结果
            cout<<emojs[0][a-1]<<'('<<emojs[1][b-1]<<emojs[2][c-1]<<emojs[1][d-1]<<')'<<emojs[0][e-1];
        putchar('\n');
    }
    return 0;
}

53

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
#define  low(a,b) ((a)-(b)<(-eps))      //浮点数比较,如果a-b的值小于某一个很小的负值,说明a在b的左侧
int N,D;
double E;
int IS_Empty(){
    int ret=0,k,cnt=0;                  //cnt用于统计用电量低于阈值的天数
    double e;
    scanf("%d",&k);             
    for(int i=0;i<k;i++){   
       scanf("%lf",&e);
       if(low(e,E)) cnt++;              //满足条件的进行统计
    }
    if(cnt*2>k) ret=1;                  //如果满足可能空置返回1
    if(k>D&&ret==1) ret=2;              //如果满足空置条件返回2
    return ret;                         
}
int main(){
    int cnt1=0,cnt2=0;
    scanf("%d %lf %d",&N,&E,&D);
    for(int i=0;i<N;i++){
        int tag=IS_Empty();
        if(tag==2) cnt2++;              //根据返回值进行判定
        else if(tag==1) cnt1++;
    }
    printf("%.1f%% %.1f%%",(100.0*cnt1)/N,(100.0*cnt2)/N);  //输出结果,%的输出要注意语法
    return 0;
}

54

#include<bits/stdc++.h>
using namespace std;
int main(){
    int N,cnt=0;
    double temp,sum=0.0;
    char a[50],b[50];
    scanf("%d",&N);
    for(int i=0;i<N;i++){
        scanf("%s",a);                      //每次读取一个字符串到a
        sscanf(a,"%lf",&temp);              //a转化成数字
        sprintf(b,"%.2f",temp);             //数字转化成字符串,这里转化的字符串一定要保留成2位小数,才会是合法的字符
        int tag=0,len=strlen(a);            //a为原始字符串,所以比较以a长度为准,比如7.123小数位数超过要求
        for(int i=0;i<len&&tag==0;i++)      //比较a和b如果相同,说明这个字符串是合法格式的数字,否则不合要求,tag改为1
            if(a[i]!=b[i]) tag=1;
        if(tag||temp<-1000||temp>1000)      //如果格式不合法,或者数据范围不合理,输出错误信息
            printf("ERROR: %s is not a legal number\n",a);
        else{
            sum+=temp;                      //合法输入进行统计
            cnt++;
        }
    }
    if(cnt==1)                              //分类进行输出
        printf("The average of 1 number is %.2f\n",sum);
    else if(cnt!=0)
        printf("The average of %d numbers is %.2f\n",cnt,sum/cnt);
    else
        printf("The average of 0 numbers is Undefined");
    return 0;
}

55

#include<bits/stdc++.h>
using namespace std;
typedef struct student{
    string name;
    int high;
}STU;
bool cmp(STU &a,STU &b){
    if(a.high!=b.high) return a.high>b.high;
    else return a.name<b.name;
}
int main(){
    int N,K;
    scanf("%d %d",&N,&K);
    STU DATA[N];
    for(int i=0;i<N;i++)                    //读入数据
        cin>>DATA[i].name>>DATA[i].high;
    sort(DATA,DATA+N,cmp);                  //按照身高从高到低排序,同身高按照名字字典序排列
    vector< vector<string> > out(K);        //输出的二维数组
    int num=N/K;                            //计算每一排人数
    for(int i=0;i<K;i++){                   //初始化每一排数组大小
        if(i==0) out[i].resize(N-(K-1)*num);//如果有剩余放在最后一排
        else out[i].resize(num);
    }
    num=0;
    for(int i=0;i<K;i++){                   
        int cnt=out[i].size();              //获取每一排人数
        int mid=cnt/2;                      //计算中间位置,题目中从1开始,如果这里用下标表示,则不用+1
        out[i][mid]=DATA[num++].name;       //放置中间位置
        int l=mid,r=mid;                    //左右两侧的位置指针,初始化为中间位置
        while(1){
            l--,r++;                        
            if(l>=0) out[i][l]=DATA[num++].name;    //在合法范围内放置,先放置摄影师视角的左侧
            if(r<cnt)out[i][r]=DATA[num++].name;    //再放置摄影师视角的右侧
            if(l<0) break;                  //显然左侧的人数大于等于右侧(以摄影师视角的左右侧),所以只判定左侧到达边界说明这一排站位结束
        }
    }
    for(int i=0;i<K;i++){                   //输出结果并控制格式
        for(int j=0;j<out[i].size();j++){
            if(j) putchar(' ');
            cout<<out[i][j];
        }
        putchar('\n');
    }
    return 0;
}

56

#include<bits/stdc++.h>
using namespace std;
int main(){
    int N,num[10]={0},sum=0;
    scanf("%d",&N);
    for(int i=0;i<N;i++)            //读入数据
        scanf("%d",&num[i]);
    for(int i=0;i<N;i++){
        for(int j=i+1;j<N;j++){     //每两个数字进行组合
            sum+=num[i]*10+num[j];  //ab 和 ba两个组合形式都进行累加
            sum+=num[j]*10+num[i];
        }
    }
    printf("%d",sum);
    return 0;
}

57

#include<bits/stdc++.h>
using namespace std;
int main(){
    int num=0,cnt1=0,cnt0=0;
    char ch;
    while((ch=getchar())!='\n'){                    //累加每一个字母的数值
        if(ch>='a'&&ch<='z') num+=ch-'a'+1;
        else if(ch>='A'&&ch<='Z') num+=ch-'A'+1;
    }
    if(num)                                         //当有字符串存在时,进行进制转换
        do{
            if(num%2==0) cnt0++;                    //如果有一位是0
            else cnt1++;                            //如果有一位是1
            num/=2; 
        }while(num);
    printf("%d %d",cnt0,cnt1);                      //输出统计出的0和1的个数
    return 0;
}

58

#include<bits/stdc++.h>
using namespace std;
typedef struct question{                //问题结构体,采用一个五位整数记录正确答案,比如选a则是10000,ab为11000,ac为10100
    int score,ans,cnt=0;                //因为没有不合理答案,所以可以统一认为所有的都是五个选项,没有的那一位就是0,不妨碍判定
}QU;
int main(){
    int N,M,maxerror=0;
    scanf("%d %d\n",&N,&M);             //使用scanf的格式参数控制过滤多余的字符
    vector<QU> v(M+1);
    for(int i=1;i<=M;i++){
        int score,num,right;
        char ch;
        scanf("%d %d %d",&score,&num,&right);   
        v[i].score=score,v[i].ans=0;    //初始化并读入每一个题目的成绩和答案
        while((ch=getchar())!='\n'){
            switch(ch){                 //ans累加每一个答案的权值,构成一个整数代表正确答案
                case 'a':v[i].ans+=10000;break;
                case 'b':v[i].ans+=1000;break;
                case 'c':v[i].ans+=100;break;
                case 'd':v[i].ans+=10;break;
                case 'e':v[i].ans+=1;break;
            }
        }
    }
    for(int i=0;i<N;i++){
        int sum=0,id=0,score=0;         //用于比对答案的sum,题目标号计数器id,当前学生成绩累加score
        char ch;
        while((ch=getchar())!='\n'){    //对于每一组学生回答的答案,进行判定
            switch(ch){                 //先处理每一个答案位
                case 'a':sum+=10000;break;
                case 'b':sum+=1000;break;
                case 'c':sum+=100;break;
                case 'd':sum+=10;break;
                case 'e':sum+=1;break;
                case '(':sum=0;break;   //遇到左括号说明到了一个新题目
                case ')':{
                            id++;       //如果遇到右括号,说明当前题目已经读取完毕,题号计数器累加
                            if(sum==v[id].ans) score+=v[id].score;      //比对答案,累计分数
                            else{ v[id].cnt++; maxerror=max(maxerror,v[id].cnt);} //如果错误累计该题目的错误人数,并获取最大错误数量
                        }
            }
        }
        printf("%d\n",score);           //输出当前学生的得分
    }
    if(maxerror==0) printf("Too simple");//如果没有人错
    else{
        printf("%d",maxerror);          //按照要求输出最后的结果
        for(int i=1;i<=M;i++)
            if(v[i].cnt==maxerror) printf(" %d",i);
    }
    return 0;
}

59

#include<bits/stdc++.h>
using namespace std;
#define MAXN 10010
bool Prime[MAXN];
int Rank[MAXN]={0};                                 //用于记录学生排名
void getPrime(){                                    //筛选法获取素数表
    fill(Prime,Prime+MAXN,true);
    Prime[0]=Prime[1]=false;
    for(int i=2;i<MAXN;i++){
        if(Prime[i]){
            for(int j=i+i;j<sqrt(1.0*MAXN);j+=i)
                Prime[j]=false;
        }
    }
}
int main(){
    getPrime();
    int N,id;
    scanf("%d",&N);
    for(int i=1;i<=N;i++){                              //读取id并记录排名,这里*10是为了保留出个位作为是否领奖的标记,初始为0,领取后置为1
        scanf("%d",&id);
        Rank[id]=10*i;
    }
    scanf("%d",&N);
    for(int i=0;i<N;i++){
        scanf("%d",&id);
        printf("%04d: ",id);
        if(Rank[id]==0) printf("Are you kidding?");     //如果不在列表中出现过
        else{
            int rank=Rank[id]/10,check=Rank[id]%10;     //获取排名和发放标记
            if(check==0){                               //如果未发放过
                Rank[id]++;                             //更新发放标记
                if(rank==1) printf("Mystery Award");    //根据排名输出奖品类型
                else if(Prime[rank]) printf("Minion");
                else printf("Chocolate");
            }
            else printf("Checked");                     //如果发放过,按要求输出
        }
        putchar('\n');                                  //结果换行
    }
    return 0;
}

60

#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
    return a>b;
}
int main(){
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++) scanf("%d",&a[i]); //读入数据
    sort(a,a+n,cmp);                        //从大到小排序
    int ans=0;
    while(ans<n&&a[ans]>ans+1)  ans++;      //在满足下标的范围内,统计满足的天数,为保证ans下标有效性,ans<n判定放在前边
    printf("%d",ans);                       //由于从大到小排列,所以ans下标总共有ans+1天,所以如果有ans+1天的骑行超过ans+1,就统计计数
    return 0;
}

当珍惜每一片时光~