PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)
題目集地址
報名了12月的PAT-B,先試試水。
已完成:2018/10/22 — 2018/11/14?
更新:(2018/12/09)PAT乙級考試100分!
考試代碼已更新
冬天坐火車跑去考試凍懵了,來年對戰PAT甲級考試!
目錄
目錄
題目集地址
目錄
1001害死人不償命的(3n+1)猜想
1002寫出這個數
1003我要通過!
1004成績排名
1005繼續(3n+1)猜想
1006換個格式輸出整數
1007素數對猜想
1008數組元素循環右移問題
1009說反話
1010一元多項式求導
1011A+B 和 C
1012數字分類
1013數素數
1014福爾摩斯的約會
1015德才論
1016部分A+B
1017A除以B
1018錘子剪刀布
1019數字黑洞
1020月餅
1021個位數統計
1022D進制的A+B
1023組個最小數
1024科學計數法
1025反轉鏈表
1026程序運行時間
1027打印沙漏
1028人口普查
1029舊鍵盤
1030完美數列
1031查驗身份證
1032挖掘機技術哪家強
1033舊鍵盤打字
1034有理數四則運算
1035插入與歸并
1036跟奧巴馬一起編程
1037在霍格沃茨找零錢
1038統計同成績學生
1039到底買不買
1040有幾個PAT
1041考試座位號
1042字符統計
1043輸出PATest
1044火星數字
1045快速排序
1046劃拳
1047編程團體賽
1048數字加密
1049數列的片段和
1050螺旋矩陣
1051復數乘法
1052賣個萌
1053住房空置率
1054求平均值
1055集體照
1056組合數的和
1057數零壹
1058選擇題
1059C語言競賽
1060愛丁頓數
1061判斷題
1062最簡分數
1063計算譜半徑
1064朋友數
1065單身狗
1066圖像過濾
1067試密碼
1068萬綠叢中一點紅
1069微博轉發抽獎
1070結繩
1071小賭怡情
1072開學寄語
1073多選題常見計分法
1074宇宙無敵加法器
1075鏈表元素分類
1076Wifi密碼
1077互評成績計算
1078字符串壓縮與解壓
1079延遲的回文數
1080MOOC期終成績
1081檢查密碼
1082射擊比賽
1083是否存在相等的差
1084外觀數列
1085PAT單位排行
1086就不告訴你
1087有多少不同的值
1088三人行
1089狼人殺-簡單版
1090危險品裝箱
>>以下5題為2018/12/09PAT參賽時所寫
1091N-自守數
1092最好吃的月餅
1093字符串A+B
1094谷歌的招聘
1095解碼PAT準考證
END
1001害死人不償命的(3n+1)猜想
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int num;scanf("%d",&num);int cnt=0;while(num!=1){cnt++;if(num%2)num=(3*num+1)/2;elsenum=num/2;}printf("%d\n",cnt);return EXIT_SUCCESS; }so so so so easy。
1002寫出這個數
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char **argv) {char* bignumber=(char*)calloc(105,sizeof(char));scanf("%s",bignumber);int sum=0;for(int i=0;i<strlen(bignumber);i++)sum+=bignumber[i]-'0';char sp[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};int list[105]={0},index=0;do{int now=sum%10;sum/=10;list[index++]=now;}while(sum);for(int i=index-1;i>=0;i--)printf("%s%c",sp[list[i]],i==0?'\n':' ');return EXIT_SUCCESS; }so so easy。
1003我要通過!
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);while(cnt--){char str[105];scanf("%s",str);int state=0,i,Afront=0,Amiddle=0,Alater=0;for(i=0;i<strlen(str);i++){if(str[i]!='P'&&str[i]!='A'&&str[i]!='T')break;if(str[i]=='P')if(state==0)state=1;elsebreak;if(str[i]=='A')if(state==1)state=2; else if(state==2)Amiddle++;else if(state==0)Afront++;elseAlater++;if(str[i]=='T')if(state==2)state=3;elsebreak;}while(Amiddle){Alater-=Afront;Amiddle--;}if(i<strlen(str)||state!=3||Afront!=Alater)printf("NO\n");elseprintf("YES\n");}return EXIT_SUCCESS; }分析題目三個通過條件可知。字符串中不能出現P、A、T之外的字符;PT之間只有一個A時(PAT),前后可以加上相同個數的A;PT中每多一個A(>2),后面加上前面個數個A。
統計字符串中P、T前中后A的個數判斷即可。
1004成績排名
#include<stdio.h> #include<stdlib.h> struct student {char name[15];char IDnumber[15];int score; }; typedef struct student student; int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);student max={"","",0},min={"","",100};while(cnt--){student new;scanf("%s%s%d",new.name,new.IDnumber,&new.score);if(new.score>max.score)max=new;if(new.score<min.score)min=new;}printf("%s %s\n",max.name,max.IDnumber);printf("%s %s\n",min.name,min.IDnumber);return EXIT_SUCCESS; }so so easy。
1005繼續(3n+1)猜想
#include<stdio.h> #include<stdlib.h> int book[4500]={0}; void getsp(int num) {if(book[num])return;while(num!=1){if(num%2)num=(3*num+1)/2;elsenum=num/2;book[num]=1;} } int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int num;int array[101]={0};while(cnt--){scanf("%d",&num);getsp(num);array[num]=1;}int firstblood=0;for(int i=100;i>0;i--)if(array[i]&&book[i]==0&&firstblood==0){printf("%d",i);firstblood=1;}else if(array[i]&&book[i]==0)printf(" %d",i);putchar('\n');return EXIT_SUCCESS; }略坑。題目意思是第一個直接執行3n+1猜想,并記錄過程中的每個數,注意是過程數;后面的每個數先判斷是否已經記錄過,記錄過就直接跳過(記錄過后面算就沒意義了),沒記錄過就執行3n+1猜想并記錄過程數。
再挨個判斷每個數是否在記錄中,記錄中存在則輸出。記錄過程的數組開大點,4500左右。
1006換個格式輸出整數
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int num;scanf("%d",&num);int chundred=num/100;while(chundred--) putchar('B');num%=100;int cten=num/10;while(cten--) putchar('S');num%=10;int st=1;while(num>=st){putchar('0'+st);st++; }putchar('\n');return EXIT_SUCCESS; }so so easy。
1007素數對猜想
#include<stdio.h> #include<stdlib.h> #include<math.h> int getsp(int num) {int sum=0;int history=2;for(int k=2;k<=num;k++){int is=0;for(int i=2;i<=(int)sqrt(k);i++)if(k%i==0){is=1;break;}if(!is&&k-history==2)sum++;if(!is)history=k;}return sum; } int main(int argc,char **argv) {int num;scanf("%d",&num);printf("%d\n",getsp(num));return EXIT_SUCCESS; }挨個計算素數,判斷當前值和上一個歷史值之差是否為 2 。
1008數組元素循環右移問題
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int num,rr;scanf("%d%d",&num,&rr);int array[105]={0};for(int i=1;i<=num;i++)scanf("%d",&array[i]);int begin=num-rr%num+1;for(int i=1;i<=num;i++){if(begin>num)begin=1;printf("%d%c",array[begin++],i==num?'\n':' ');}return EXIT_SUCCESS; }模擬實現匯編的 RR 。
1009說反話
#include<stdio.h> #include<string.h> char str[85]; int book[85][2]; int main(int argc,char** argv) {scanf("%[^\n]",str);int ind,ins=strlen(str),con=0,booknow=0;for(ind=0;ind<ins;ind++){if(str[ind]!=' '&&!con){con=1;book[booknow][0]=ind;}else if(str[ind]==' '&&con){con=0;book[booknow++][1]=ind;}}if(con)book[booknow++][1]=ins;for(ind=booknow-1;ind>=0;ind--){for(ins=book[ind][0];ins<book[ind][1];ins++)printf("%c",str[ins]);printf("%c",ind==0?'\n':' ');}return 0; }記錄每個單詞的起始和終止位置。
1010一元多項式求導
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int sp[1005][2];int i=0;while(scanf("%d%d",&sp[i][0],&sp[i][1])!=EOF)i++;int firstblood=0;for(int j=0;j<=i-1;j++)if(sp[j][0]*sp[j][1]){if(firstblood==0)firstblood=1;elseputchar(' ');printf("%d %d",sp[j][0]*sp[j][1],sp[j][1]-1);}if(!firstblood)printf("0 0");putchar('\n');return EXIT_SUCCESS; }小小小坑。存在負指數。
1011A+B 和 C
#include<stdio.h> #include<stdlib.h> #include<string.h> #define max(a,b) (a<b?b:a) #define min(a,b) (a>b?b:a) int main(int argc, char *argv[]) {int cnt;scanf("%d",&cnt);for(int i=1;i<=cnt;i++){long long a,b,c;scanf("%ld%ld%ld",&a,&b,&c);if(a+b>c)printf("Case #%d: true\n",i);elseprintf("Case #%d: false\n",i);} return 0; }so so so so easy……
1012數字分類
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int A1=0,A2=0,A3=0,A5=0,A2p=-1,A2els=0;double A4=0.0,A4p=0.0;while(cnt--){int num;scanf("%d",&num);if(num%5==0&&num%2==0)A1+=num;if(num%5==1){A2p*=-1;A2+=A2p*num;A2els=1;}if(num%5==2){A3++;}if(num%5==3){A4+=num;A4p++;}if(num%5==4){if(num>A5)A5=num;}}if(A1==0)printf("N ");elseprintf("%d ",A1);if(A2els==0)printf("N ");elseprintf("%d ",A2);if(A3==0)printf("N ");elseprintf("%d ",A3);if(A4p==0.0)printf("N ");elseprintf("%.1lf ",A4/A4p);if(A5==0)printf("N\n");elseprintf("%d\n",A5);return EXIT_SUCCESS; }小小小坑,判斷每一個情況是否有值。
1013數素數
#include<stdio.h> #include<stdlib.h> #include<math.h> int ispre(int num) {if(num==1)return 0;if(num==2)return 1;for(int i=2;i<=num/i;i++){if(num%i==0)return 0;}return 1; } int array[10002]; int main(int argc,char **argv) {int M,N,cnt=0;scanf("%d%d",&M,&N);int i,j;for(i=2,j=1;j<=10000;i++){if(ispre(i))array[j++]=i;}for(i=M;i<=N;i++){cnt++;printf("%d",array[i]);if(cnt%10==0||i==N)printf("\n");elseprintf(" ");}return EXIT_SUCCESS; }so so so easy,先打表,按要求依次輸出。
1014福爾摩斯的約會
#include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc,char **argv) {char str1[100],str2[100],str3[100],str4[100];scanf("%s%s%s%s",str1,str2,str3,str4);char week[10][4]={"MON","TUE","WED","THU","FRI","SAT","SUN"};int first=-1,secend=-1,third=-1;for(int i=0;;i++){if(str1[i]==str2[i]&&first!=-1){if(isdigit(str1[i])){secend=str1[i]-'0';break;}else if(str1[i]>='A'&&str1[i]<='N'){secend=str1[i]-'A'+10;break;}}if(str1[i]==str2[i]&&first==-1&&(str1[i]>='A'&&str1[i]<='G')){first=str1[i]-'A';}}for(int i=0;;i++){if(str3[i]==str4[i]&&third==-1&&isalpha(str3[i])){third=i;break;}}printf("%s %02d:%02d\n",week[first],secend,third);return EXIT_SUCCESS; }小小坑。A-N和A-G的范圍不能用無腦直接用isupper……。
1015德才論
#include<stdio.h> #include<stdlib.h> struct man {int number,de,cai;int rank; }; struct man sp[100000]; int compare(const void *a,const void *b) {const struct man *as=a;const struct man *bs=b;if(as->rank!=bs->rank)return -(as->rank-bs->rank);else if((as->de+as->cai)!=(bs->de+bs->cai))return -(as->de+as->cai)+(bs->de+bs->cai);else if(as->de!=bs->de)return -(as->de-bs->de);elsereturn as->number-bs->number; } int main(void) {int N,baseline,additionline;scanf("%d%d%d",&N,&baseline,&additionline);int index=0,sum=0;while(N--){int a,b,c,d;scanf("%d%d%d",&a,&b,&c);if(b<baseline||c<baseline)continue;sum++;if(b>=additionline&&c>=additionline){d=4;sp[index].number=a;sp[index].de=b;sp[index].cai=c;sp[index++].rank=d;continue;}if(b>=additionline&&c<additionline){d=3;sp[index].number=a;sp[index].de=b;sp[index].cai=c;sp[index++].rank=d;continue;}if(b>=c&&b<additionline&&c<additionline){d=2;sp[index].number=a;sp[index].de=b;sp[index].cai=c;sp[index++].rank=d;continue;}d=1;sp[index].number=a;sp[index].de=b;sp[index].cai=c;sp[index++].rank=d;}qsort(sp,index,sizeof(struct man),compare);printf("%d\n",sum);for(int i=0;i<index;i++){printf("%d %d %d\n",sp[i].number,sp[i].de,sp[i].cai);}return EXIT_SUCCESS; }編寫compare函數借助qsort即可,STL的sort同理。
1016部分A+B
#include<stdio.h> #include<stdlib.h> int getnum(int sp,int key) {int sumn=0;while(sp){int sol=sp%10;if(sol==key)sumn=sumn*10+key;sp/=10;}return sumn; } int main(int argc,char *argv[]) {int a,as,b,bs;scanf("%d%d%d%d",&a,&as,&b,&bs);printf("%d\n",getnum(a,as)+getnum(b,bs));return EXIT_SUCCESS; }so easy。提取符合的每一位相加。
1017A除以B
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char *argv[]) {char bignumber[1005];char div[1005];scanf("%s",bignumber);int key;scanf("%d",&key);int mod=0,index=0,firstblood=0;for(int i=0;i<strlen(bignumber);i++){mod+=bignumber[i]-'0';if(key>mod){mod*=10;if(firstblood)div[index++]='0';continue;}if(!firstblood)firstblood=1;div[index++]=mod/key+'0';mod=mod%key*10;}if(index==0)div[index++]='0';div[index]=0;printf("%s %d\n",div,mod/10);return EXIT_SUCCESS; }小坑,存在除數為 0 的情況。
1018錘子剪刀布
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int cnt;scanf("%d%*c",&cnt);int wina[5]={0},winb[5]={0},wa=0,wb=0,equ=0,max;char maxa='B',maxb='B';while(cnt--){char q,w;scanf("%c %c%*c",&q,&w);if(q=='C'&&w=='J'||q=='J'&&w=='B'||q=='B'&&w=='C'){wa++;if(q=='B')wina[1]++;if(q=='C')wina[2]++;if(q=='J')wina[3]++;max=wina[1],maxa='B';if(wina[2]>max)max=wina[2],maxa='C';if(wina[3]>max)max=wina[3],maxa='J';continue;}else if(w=='C'&&q=='J'||w=='J'&&q=='B'||w=='B'&&q=='C'){wb++;if(w=='B')winb[1]++;if(w=='C')winb[2]++;if(w=='J')winb[3]++;max=winb[1],maxb='B';if(winb[2]>max)max=winb[2],maxb='C';if(winb[3]>max)max=winb[3],maxb='J';continue;}elseequ++;}printf("%d %d %d\n%d %d %d\n",wa,equ,wb,wb,equ,wa);printf("%c %c\n",maxa,maxb);return EXIT_SUCCESS; }so easy。統計輸贏情況。
1019數字黑洞
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int whole;scanf("%d",&whole);int a[5],firstblood=0;while(whole!=6174&&whole!=0||firstblood==0){if(!firstblood)firstblood=1;a[1]=whole%10;a[2]=whole/10%10;a[3]=whole/100%10;a[4]=whole/1000%10;for(int i=1;i<4;i++)for(int j=1;j<=4-i;j++)if(a[j]>a[j+1]){int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}int big=a[1]+a[2]*10+a[3]*100+a[4]*1000;int small=a[4]+a[3]*10+a[2]*100+a[1]*1000;whole=big-small;printf("%04d - %04d = %04d\n",big,small,whole);}return EXIT_SUCCESS; }小坑,輸入是6174的情況。
1020月餅
#include<stdio.h> #include<stdlib.h> //#define HOST typedef struct {double si;double sum,num; }moon; moon cakes[1005]={0}; int compare(const void *a,const void *b) {const moon *sa=(const moon*)a;const moon *sb=(const moon*)b;if(sb->si>sa->si)return 1;if(sb->si<sa->si)return -1;return 0; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint n,need;scanf("%d%d",&n,&need);for(int i=0;i<n;i++)scanf("%lf",&cakes[i].num);for(int i=0;i<n;i++)scanf("%lf",&cakes[i].sum);for(int i=0;i<n;i++)cakes[i].si=cakes[i].sum/cakes[i].num;qsort(cakes,n,sizeof(moon),compare);double ans=0.0;for(int i=0;i<n;i++){if(need<=cakes[i].num){ans+=cakes[i].si*need;break;}else{ans+=cakes[i].sum;need-=cakes[i].num;}}printf("%.2lf\n",ans);return EXIT_SUCCESS; }小坑。第二行第三行輸入的庫存和總價題目說明是正數,可以是小數的。
1021個位數統計
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char *argv[]) {char bignumber[1005];int book[10]={0};scanf("%s",bignumber);for(int i=0;i<strlen(bignumber);i++)book[bignumber[i]-'0']++;for(int i=0;i<10;i++)if(book[i])printf("%d:%d\n",i,book[i]);return EXIT_SUCCESS; }so so so so easy。統計各個數字出現個數輸出。
1022D進制的A+B
#include<stdio.h> #include<stdlib.h> #include<string.h> int* tobasenumber(long long original,int base) {static int array[30]={0},index=1;if(!original)array[index++]=0;while(original){array[index++]=original%base;original/=base;}array[0]=index-1;return array; } int main(int argc,char *argv[]) {long long a,b;scanf("%lld%lld",&a,&b);long long sum=a+b;int base;scanf("%d",&base);int *point=tobasenumber(sum,base);for(int i=point[0];i>0;i--)printf("%d",point[i]);putchar('\n');return EXIT_SUCCESS; }小坑。存在和為 0 的情況。
1023組個最小數
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char *argv[]) {int book[10]={0};for(int i=0;i<10;i++)scanf("%d",&book[i]);int index=1;while(book[index]==0)index++;book[index]--;printf("%d",index);index=0;while(index<=9){if(!book[index]){index++;continue; }printf("%d",index);book[index]--;}putchar('\n');return EXIT_SUCCESS; }so easy。第一個數從1開始取最小數,后面的數從零開始取。
1024科學計數法
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char *argv[]) {char str[11000];scanf("%s",str);int ends=0;for(int i=1;;i++)if(str[i]=='E'){ends=i;break;}int psss=0,endall=strlen(str)-1,copyends=ends+2;while(endall>=copyends){psss=psss*10+str[copyends]-'0';copyends++;}if(str[ends+1]=='-')psss=-psss;if(str[0]=='-')putchar(str[0]);if(psss>0){printf("%c",str[1]);for(int i=0;i<ends-3||i<psss;i++){if((i==psss)&&(i<ends-3))putchar('.');if(i<ends-3)putchar(str[i+3]);elseputchar('0');}}else if(psss<0){putchar('0');putchar('.');for(int i=1;i<abs(psss);i++)putchar('0');putchar(str[1]);for(int i=0;i<ends-3;i++)putchar(str[i+3]);}else{for(int i=1;i<ends;i++)putchar(str[i]);}putchar('\n');return EXIT_SUCCESS; }先把輸入處理成有效數字、正負號、指數值幾部分,后根據指數正、負、零,分析輸出即可。
1025反轉鏈表
#include<stdio.h> #include<stdlib.h> //#define HOST typedef struct {int data;int next; }node; node sp[100005]={0}; int ans[100005]={0}; void reverse(int left,int right) {while(left<right){int temp=ans[left];ans[left]=ans[right];ans[right]=temp;left++,right--;}return; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint begin,cnt,isp;scanf("%d%d%d",&begin,&cnt,&isp);for(int i=0;i<cnt;i++){int temp;scanf("%d",&temp);scanf("%d%d",&sp[temp].data,&sp[temp].next);}int index=0;while(begin!=-1){ans[index++]=begin;begin=sp[begin].next;}for(int i=0;i<(index)/isp;i++){int left=i*isp,right=(i+1)*isp-1;reverse(left,right);}printf("%05d %d",ans[0],sp[ans[0]].data);for(int i=1;i<index;i++)printf(" %05d\n%05d %d",ans[i],ans[i],sp[ans[i]].data);printf(" -1\n");return EXIT_SUCCESS; }讀取鏈表數據,轉換成數組存儲。逐一反轉數組即可。
1026程序運行時間
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int time1,time2;scanf("%d%d",&time1,&time2);float time=(time2-time1)/100.0-(time2-time1)/100;if(time>=0.5)time=(time2-time1)/100+1;elsetime=(time2-time1)/100;int sp=time;printf("%02d:%02d:%02d\n",sp/3600,sp%3600/60,sp%3600%60);return EXIT_SUCCESS; }so so easy。得到程序運行秒數后,四舍五入成整數后按格式輸出。
1027打印沙漏
#include<stdio.h> int main(int argc,char** argv) {int sum;char ch;scanf("%d %c",&sum,&ch);int i=1,msum=1,fk=sum-msum;while(fk>=(i+2)*2){i+=2;msum+=2*i;fk=sum-msum;}int ins=i;while(ins>1){int ind=ins,inf=(i-ins)/2;while(inf--)putchar(' ');while(ind--)putchar(ch);putchar('\n');ins-=2;}int inf=(i-1)/2;while(inf--)putchar(' ');putchar(ch);putchar('\n');ins=3;while(ins<=i){int ind=ins,inf=(i-ins)/2;while(inf--)putchar(' ');while(ind--)putchar(ch);putchar('\n');ins+=2;}printf("%d\n",fk);return 0; }老題目,先計算好沙漏第一行字符個數和剩余值,循環輸出即可。
1028人口普查
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct member {char name[10];int year,month,day; }member;int compare(member x,member y) {if(x.year==y.year)if(x.month==y.month)if(x.day==y.day)return 0;elsereturn x.day-y.day;elsereturn x.month-y.month;elsereturn x.year-y.year; } int check(member x) {if(x.year>2014)return 1;if(x.year==2014){if(x.month>9)return 1;if(x.month==9)if(x.day>6)return 1;}if(x.year<1814)return 1;if(x.year==1814){if(x.month<9)return 1;if(x.month==9)if(x.day<6)return 1;}return 0; } int main(int argc, char *argv[]) {int cnt;scanf("%d",&cnt);member maxn,minn;int sumcurrect=0,firstblood=0;while(cnt--){member now;scanf("%s%d/%d/%d",now.name,&now.year,&now.month,&now.day);if(check(now))continue;sumcurrect++;if(!firstblood){firstblood=1;maxn=minn=now;}else{if(compare(now,maxn)>0)maxn=now;if(compare(minn,now)>0)minn=now; } }if(firstblood)printf("%d %s %s\n",sumcurrect,minn.name,maxn.name);elseprintf("0\n");return 0; }天坑。存在沒有一個滿足的人的情況(只輸出一個 0 ),還需考慮只有一個滿足的人的情況(最大最小輸出同一個人的名字)。
1029舊鍵盤
#include<stdio.h> #include<ctype.h> int book[128]={0}; char stack[1000]={0}; int main(int argc,char** agrv) {char str1[1000],str2[1000];scanf("%s%s",str1,str2);int point1=0,point2=0,point3=0;while(str1[point1]){if(str1[point1]==str2[point2]){point1++;point2++;}else{int sp=toupper(str1[point1]);if(book[sp]==0){book[sp]=1;stack[point3++]=sp;}point1++;}}stack[point3]=0;printf("%s\n",stack);return 0; }so easy。
1030完美數列
#include<stdio.h> #include<stdlib.h> #define max(x,y) ((x>y)?(x):(y)) long long array[100005]; int compare(const void *a,const void *b) {return (*(long long*)a-*(long long*)b); } int main(int argc,char **argv) {int cnt,k;scanf("%d%d",&cnt,&k);for(int i=0;i<cnt;i++){scanf("%lld",&array[i]);}qsort(array,cnt,sizeof(long long),compare);int sp=0;for(int i=0;i<cnt;i++)for(int j=i+sp;j<cnt;j++)if(array[i]*k<array[j])break;elsesp=max(sp,j-i+1);printf("%d\n",sp);return EXIT_SUCCESS; }排序后循環查找最大可能值。
1031查驗身份證
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int cnt;scanf("%d",&cnt);int table[20]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};int allok=1;while(cnt--){char idcardnumber[20];scanf("%s",idcardnumber);int sum=0;for(int i=0;i<17;i++)sum+=(idcardnumber[i]-'0')*table[i];sum%=11;char book[20]={'1','0','X','9','8','7','6','5','4','3','2'};if(book[sum]!=idcardnumber[17]){if(allok)allok=0;printf("%s\n",idcardnumber);}}if(allok)printf("All passed\n");return EXIT_SUCCESS; }按所給計算方法判斷是否通過。
1032挖掘機技術哪家強
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int cnt,max=0;scanf("%d",&cnt);int *array=(int*)calloc(100005,sizeof(int));while(cnt--){int a,b;scanf("%d%d",&a,&b);array[a]+=b;if(array[max]<array[a])max=a;}printf("%d %d\n",max,array[max]);free(array);return EXIT_SUCCESS; }so easy。
1033舊鍵盤打字
#include <stdio.h> #include <ctype.h> int main(int argc,char** argv) {char A[128] = {0}, ch;while ((ch = getchar()) != '\n')A[ch]++;while ((ch = getchar()) != '\n')if ((isupper(ch) && A[43]) || A[toupper(ch)])continue;elseputchar(ch);return 0; }記錄第一個字符串出現字符,過濾第二個字符串。
1034有理數四則運算
#include<stdio.h> #include<stdlib.h> #define mabs(a) (a<0?(-a):(a)) long long gcd(long long m,long long n) {if(m<0)m=-m;if(n<0)n=-n;return (m%n?gcd(n,m%n):n); } void printnum(long long a,long long b) {if (b == 0){printf("Inf");return;}int sign=1;if((a<0&&b>0)||(a>0&&b<0)){sign=-1;}a=mabs(a);b=mabs(b);int temp=gcd(a, b);a/=temp;b/=temp;if(sign==-1)printf("(-");if(b==1)printf("%lld", a);else if(a>b)printf("%lld %lld/%lld",a/b,a%b,b);elseprintf("%ld/%ld", a, b);if(sign==-1)printf(")");return; } int main(int argc,char **argv) {long long a[2],b[2];scanf("%lld/%lld %lld/%lld",&a[0],&a[1],&b[0],&b[1]);printnum(a[0],a[1]);printf(" + ");printnum(b[0],b[1]);printf(" = ");printnum(a[0]*b[1]+a[1]*b[0],a[1]*b[1]);putchar('\n');printnum(a[0],a[1]);printf(" - ");printnum(b[0],b[1]);printf(" = ");printnum(a[0]*b[1]-a[1]*b[0],a[1]*b[1]);putchar('\n');printnum(a[0],a[1]);printf(" * ");printnum(b[0],b[1]);printf(" = ");printnum(a[0]*b[0],a[1]*b[1]);putchar('\n');printnum(a[0],a[1]);printf(" / ");printnum(b[0],b[1]);printf(" = ");printnum(a[0]*b[1],a[1]*b[0]);putchar('\n');return EXIT_SUCCESS; }坑。必須使用long long。分成兩部分,一部分是直接計算分子、分母值及格式輸出;另一部分是化簡分子、分母為要求的格式。
1035插入與歸并
#include<stdio.h> #include<stdlib.h> //#define HOST void InsertionSort(int *arr,int begin,int len) {if(begin>=len)begin=len-1;int temp=arr[begin];for(int i=begin-1;i>=0;i--){if(arr[i]>temp)arr[i+1]=arr[i],arr[i]=temp;elsebreak;}return; } void MergeSort(int *arr,int begin,int len) {if(begin>=len)begin=len;int start=0,end=0;for(int i=0;i<len;i+=begin){start=i;end=(start+begin>len?len:start+begin);for(int m=end-1;m>=start;m--){int iloc=-1,max=arr[start],l=0;for(l=start;l<=m;l++)if(arr[l]>=max)iloc=l,max=arr[l]; if(iloc>=0)arr[iloc]=arr[l-1],arr[l-1]=max; }}return; } int match(int *diff1,int *diff2,int len) {for(int i=0;i<len;i++)if(diff1[i]!=diff2[i])return 0;return 1; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,num1[105]={0},num2[105]={0},num1s[105]={0};scanf("%d",&cnt);for(int i=0;i<cnt;i++)scanf("%d",&num1[i]);for(int i=0;i<cnt;i++)scanf("%d",&num2[i]);for(int i=0;i<cnt;i++) num1s[i]=num1[i];for(int i=1;i<cnt;i++){InsertionSort(num1s,i,cnt);if(match(num2,num1s,cnt)){printf("Insertion Sort\n"); InsertionSort(num1s,i+1,cnt);for(int j=0;j<cnt;j++)printf("%d%c",num1s[j],j==cnt-1?'\n':' ');return EXIT_SUCCESS;}}for(int i=1;i<=2*cnt;i*=2){MergeSort(num1,i,cnt);if(match(num2,num1,cnt)){printf("Merge Sort\n");MergeSort(num1,2*i,cnt);for(int j=0;j<cnt;j++)printf("%d%c",num1[j],j==cnt-1?'\n':' ');return 0;}} return EXIT_SUCCESS; }考察插入排序和歸并排序。一步一步進行插入/歸并排序,如果出現與目標序列一致則輸出排序種類,再進行一次對應排序后輸出序列。
1036跟奧巴馬一起編程
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int cnt;char ch;scanf("%d %c",&cnt,&ch);for(int i=1;i<=cnt;i++)putchar(ch);putchar('\n');for(int i=1;i<=(int)((cnt/2.0)+0.5)-2;i++){putchar(ch);for(int j=1;j<=cnt-2;j++)putchar(' ');putchar(ch);putchar('\n');}for(int i=1;i<=cnt;i++)putchar(ch);putchar('\n'); return EXIT_SUCCESS; }so easy。
1037在霍格沃茨找零錢
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int a,b,c;int x,y,z;scanf("%d.%d.%d",&a,&b,&c);scanf("%d.%d.%d",&x,&y,&z);int abc,xyz;abc=c+b*29+a*17*29;xyz=z+y*29+x*17*29;abc-=xyz;if(abc>0)putchar('-');elseabc=-abc;printf("%d.%d.%d\n",abc/(17*29),abc%(17*29)/29,abc%(17*29)%29);return EXIT_SUCCESS; }so easy。單位轉換。
1038統計同成績學生
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int *array=(int*)calloc(101,sizeof(int));int cnt;scanf("%d",&cnt);while(cnt--){int score;scanf("%d",&score);array[score]++;}scanf("%d",&cnt);while(cnt--){int sp;scanf("%d",&sp);printf("%d",array[sp]);if(cnt)printf(" ");}free(array);return EXIT_SUCCESS; }so so so easy。
1039到底買不買
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int *array=(int*)calloc(128,sizeof(int));char sp;int total=0;while(sp=getchar(),sp!='\n'){array[sp]++;total++; }while(sp=getchar(),sp!='\n'){array[sp]--;total--; }int require=0,none=1,redundant=0;for(int i=1;i<128;i++){if(array[i]<0){if(none)none=0;require+=-array[i]; }if(array[i]>0)redundant+=array[i]; }if(none)printf("Yes %d\n",redundant);elseprintf("No %d\n",require);free(array);return EXIT_SUCCESS; }根據第一個字符串統計第二個字符串,多出/缺少的字符數。
1040有幾個PAT
#include<stdio.h> #include<stdlib.h> #define MOD 1000000007 int main(int argc,char *argv[]) {int p=0,pa=0,pat=0;char sp;while(sp=getchar(),sp!='\n'){if(sp=='P')p++;if(sp=='A'){pa+=p;pa%=MOD;}if(sp=='T'){pat+=pa;pat%=MOD;}}printf("%d\n",pat);return EXIT_SUCCESS; }每個A都可以和前面任意一個P配對,每個T都可以和前面任意一個PA配對。還需不斷的取余。
(a+b+c)%d==(a%d+b%d+c%d)%d
1041考試座位號
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct {char ID[20];int num; }student; int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);student *sp=(student*)calloc(cnt+1,sizeof(student));while(cnt--){student now;int index;scanf("%s %d %d",now.ID,&index,&now.num);strcpy(sp[index].ID,now.ID);sp[index].num=now.num;}scanf("%d",&cnt);while(cnt--){int index;scanf("%d",&index);printf("%s %d\n",sp[index].ID,sp[index].num);}free(sp);return EXIT_SUCCESS; }so easy。結構體數組存取。
1042字符統計
#include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc,char **argv) {int alpha[26]={0};char ch;while((ch=getchar())!=EOF)if(isalpha(ch))alpha[tolower(ch)-'a']++;int max=0,sp;for(int i=25;i>=0;i--)if(alpha[i]>=max)sp=i,max=alpha[i];printf("%c %d\n",sp+'a',max);return EXIT_SUCCESS; }將字母變成小寫后,統計出現個數。逆序查找最大值。
1043輸出PATest
#include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc,char **argv) {int alpha[7]={0};char ch;int sum=0;while((ch=getchar())!=EOF){if(ch=='P')alpha[1]++,sum++;if(ch=='A')alpha[2]++,sum++;if(ch=='T')alpha[3]++,sum++;if(ch=='e')alpha[4]++,sum++;if(ch=='s')alpha[5]++,sum++;if(ch=='t')alpha[6]++,sum++;}char sp[7]={0,'P','A','T','e','s','t'};while(sum)for(int i=1;i<=6;i++)if(alpha[i]>0){alpha[i]--;sum--;putchar(sp[i]);}return EXIT_SUCCESS; }so so easy,篩選輸出。
1044火星數字
#include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<string.h> char mars1[13][4]={"","tam","hel","maa","huh","tou","kes",\ "hei","elo","syy","lok","mer","jou"}; char mars2[13][5]={"tret","jan","feb","mar","apr","may","jun",\ "jly","aug","sep","oct","nov","dec"}; void tomars(int num) {int sp1=num/13,sp2=num%13;if(sp1)printf("%s",mars1[sp1]);if(sp1&&sp2)putchar(' ');if((!sp2&&!sp1)||sp2)printf("%s",mars2[sp2]);putchar('\n');return; } void toearth(char *str) {int sum=0;char temp[4]="",temps[5]="";sscanf(str,"%s%s",temp,temps);int sp1,sp2;for(int i=1;i<=12;i++)if(!strcmp(mars1[i],temp)){sum+=i*13;break;}for(int i=0;i<=12;i++)if(!strcmp(mars2[i],temps)||!strcmp(mars2[i],temp)){sum+=i;break;}printf("%d\n",sum);return; } int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);while(cnt--){char str[20]={0};scanf("%*c%[^\n]",str);if(isdigit(str[0])){int num;sscanf(str,"%d",&num);tomars(num);}elsetoearth(str);}return EXIT_SUCCESS; }花里胡哨版進制轉換,用sscanf從字符串中讀取可以簡便許多。
1045快速排序
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int sp[100001][3],dp[100001];for(int i=0;i<cnt;i++)scanf("%d",&sp[i][0]);int leftmax=0;for(int i=0;i<cnt;i++){sp[i][1]=leftmax;if(sp[i][0]>leftmax)leftmax=sp[i][0];}int rightmin=1<<30;for(int i=cnt-1;i>=0;i--){sp[i][2]=rightmin;if(sp[i][0]<rightmin)rightmin=sp[i][0];}int index=0,sum=0;for(int i=0;i<cnt;i++){int ok=1;if(sp[i][1]>=sp[i][0])ok=0;if(sp[i][2]<=sp[i][0])ok=0;if(ok){sum++;dp[index++]=sp[i][0];}}printf("%d\n",sum);for(int i=0;i<index;i++){ printf("%d",dp[i]);if(i!=index-1)putchar(' '); }putchar('\n');return EXIT_SUCCESS; }此題天坑!首先如果輸入 0 的話,得到的輸出應該是 0后面跟兩個回車……測試點2就是輸入為0。
其次,題目中說按遞增順序輸出這些元素。意思是按原順序輸出,并不用遞增排序。
于是跑一遍左側最大值、右側最小值,選擇滿足要求的輸出就完事了……
1046劃拳
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int suma=0,sumb=0;while(cnt--){int a,b,sa,sb;scanf("%d%d%d%d",&a,&sa,&b,&sb);if(a+b==sa&&a+b!=sb)suma++;if(a+b==sb&&a+b!=sa)sumb++;}printf("%d %d\n",sumb,suma);return EXIT_SUCCESS; }so so so so easy。
1047編程團體賽
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt;int score[1001]={0};scanf("%d",&cnt);while(cnt--){int team,member;scanf("%d-%*d",&team);scanf("%d",&member);score[team]+=member;}int max=0;for(int i=1;i<=1000;i++){if(score[i]>score[max])max=i;}printf("%d %d\n",max,score[max]);return EXIT_SUCCESS; }so so so easy。
1048數字加密
#include<stdio.h> #include<stdlib.h> #include<string.h> char gotch(int num) {if(num>=0&&num<=9)return num+'0';else if(num==10)return 'J';else if(num==11)return 'Q';else if(num==12)return 'K';return -1; } int main(int argc,char **argv) {char *ans=NULL,*other=NULL;char num1[105],num2[105];scanf("%s%s",num1,num2);int i,sp=1;int len1=strlen(num1)-1,len2=strlen(num2)-1;if(len1>len2)ans=num1;elseans=num2;for(i=strlen(ans)-1;i>=0;i--){char temp1,temp2;if(len1<0)temp1='0';elsetemp1=num1[len1--];if(len2<0)temp2='0';elsetemp2=num2[len2--];if(sp){ans[i]=gotch(((temp1-'0')+(temp2-'0'))%13);sp=0;}else{ ans[i]=temp2-temp1;if(ans[i]<0)ans[i]+='0'+10;elseans[i]+='0';sp=1;}}printf("%s\n",ans);return EXIT_SUCCESS; }天坑!題目并沒有說明白數字A可能比數字B長,測試點2和5就是數字A比數字B長的情況,這時需要短的數字補零。
顯而易見的做法是反轉字符串,然后把短的補零,再逐位計算。
。。然而我并不想寫reverse函數。
1.判斷哪個數字長,指針指向長的數字。
2.兩數字從個位開始逐位計算,如果有一個數字的索引 <0 則去值為 ‘0’ 。
3.輸出指針所指的字符串。
1049數列的片段和
#include<iostream> using namespace std; int main(int argc,char *argv[]) {int cnt;cin>>cnt;long double sum=0.0;for(int i=1;i<=cnt;++i){long double temp;cin>>temp;sum+=temp*i*(cnt+1-i);}printf("%.2Lf\n",sum);return 0; }每個數出現的個數是(左邊數的個數+1)*(右邊數的個數+1)。
1050螺旋矩陣
#include<stdio.h> #include<stdlib.h> #include<math.h> int compare(const void *a,const void *b) {return -*(const int*)a+*(const int*)b; } int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int i,j,index=1;int *array=(int*)calloc(cnt+1,sizeof(int));for(i=1;i<=cnt;i++)scanf("%d",&array[i]);qsort(array+1,cnt,sizeof(int),compare); int n=(int)floor(sqrt(cnt)),m;while(cnt%n)n--;m=cnt/n;int **matrix=(int**)calloc(m+5,sizeof(int*));for(i=0;i<=m+5;i++)matrix[i]=(int*)calloc(n+5,sizeof(int));i=j=1;while(cnt>0){while(matrix[i][j]==0&&j<=n)matrix[i][j++]=array[index++],cnt--;j--,i++;while(matrix[i][j]==0&&i<=m)matrix[i++][j]=array[index++],cnt--;i--,j--;while(matrix[i][j]==0&&j>=1)matrix[i][j--]=array[index++],cnt--;j++,i--;while(matrix[i][j]==0&&i>=1)matrix[i--][j]=array[index++],cnt--;i++,j++;}for(i=1;i<=m;i++)for(j=1;j<=n;j++)printf("%d%c",matrix[i][j],j==n?'\n':' ');return EXIT_SUCCESS; }free函數竟然會導致運行時錯誤。。肯能是PAT這里只能申請堆內存不能釋放??
沒有說明N的大小范圍,須動態申請內存空間。
1051復數乘法
#include<stdio.h> #include<stdlib.h> #include<math.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifdouble R1,R2,P1,P2;scanf("%lf%lf%lf%lf",&R1,&P1,&R2,&P2);double t1=R1*cos(P1),r1=R1*sin(P1),t2=R2*cos(P2),r2=R2*sin(P2);double ans1=t1*t2-r1*r2;double ans2=t1*r2+t2*r1;if(ans1>-0.005&&ans1<0.0)ans1=0.0;if(ans2>-0.005&&ans2<0.0)ans2=0.0;printf("%.2lf%+.2lfi\n",ans1,ans2); return EXIT_SUCCESS; }小坑。須注意 0.0 ~ -0.005 之間四舍五入成 -0.0 的問題,應是 +0.0 。
1052賣個萌
#include<stdio.h> #include<stdlib.h> #include<string.h> int get(char out[][10]) {char temp;int index=0,spdex=0;while((temp=getchar())!='\n'){if(temp=='['){index=0;while((temp=getchar())!=']')out[spdex][index++]=temp;out[spdex][index]=0;spdex++;}}return spdex; } int main(int argc,char **argv) {char shou[15][10]={0};char yan[15][10]={0};char kou[15][10]={0};int shoumax=get(shou);int yanmax=get(yan);int koumax=get(kou);int cnt; scanf("%d",&cnt);while(cnt--){int t1,t2,t3,t4,t5;scanf("%d%d%d%d%d",&t1,&t2,&t3,&t4,&t5);if((t1<1||t1>shoumax)||(t2<1||t2>yanmax)||(t3<1||t3>koumax)||(t4<1||t4>yanmax)||(t5<1||t5>shoumax)){printf("Are you kidding me? @\\/@\n");continue;}printf("%s",shou[t1-1]);putchar('(');printf("%s",yan[t2-1]);printf("%s",kou[t3-1]);printf("%s",yan[t4-1]);putchar(')');printf("%s",shou[t5-1]);putchar('\n');}return EXIT_SUCCESS; }小坑。不知道是不是編碼類型不對,在筆記本上運行讀取不了貌似是日語的字符。一開始用掃描集讀取一行也失敗了,失敗原因應該就是日語字符讀取失敗直接退出了。
1053住房空置率
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt,lday; double limit;scanf("%d%lf%d",&cnt,&limit,&lday);int maybe=0,able=0;for(int j=0;j<cnt;j++){int cnts,mb=0;double input;scanf("%d",&cnts);for(int i=0;i<cnts;i++){scanf("%lf",&input);if(input<limit)mb++;}if(mb>(cnts/2)){if(cnts>lday)able++;elsemaybe++;}}printf("%.1lf%% %.1lf%%\n",(double)maybe/cnt*100.0,(double)able/cnt*100.0);return EXIT_SUCCESS; }坑!題目中說的是“?若觀察期超過某給定閾值 ”,并不是低于電量低于某給定的閾值e的天數…
看題的時候想當然了,理解錯的話測試點1,2就會過不去。
1054求平均值
#include<stdio.h> #include<ctype.h> #include<stdlib.h> #include<stdbool.h> #include<math.h> bool check(char *s) {int i=0;if(s[0]=='-')i++;for(;s[i]&&s[i]!='.';i++)if(!isdigit(s[i]))return false; if(s[i]=='.')for(int j=i+1;s[j];j++)if(!isdigit(s[j])||j-i>2)return false; double temp=fabs(atof(s));if(temp>1000.0)return false;return true; } int main(int argc,char **argv) {int cnt;scanf("%d",&cnt);int ins=0;double sum=0.0;while(cnt--){char str[100]={0};scanf("%s",str);if(check(str)){ins++;sum+=atof(str);}elseprintf("ERROR: %s is not a legal number\n",str);}if(ins){if(ins==1)printf("The average of 1 number is %.2lf\n",sum);elseprintf("The average of %d numbers is %.2f\n",ins,sum/ins);}elseprintf("The average of 0 numbers is Undefined\n");return EXIT_SUCCESS; }一上來就想用個sscanf騷操作。。一番操作浪費了一個多小時……
然后老老實實的先判斷再 atof(str) 了。。。
1055集體照
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct {char name[10];int high; }student; int compare(const void *a,const void *b) {const student *sa=a;const student *sb=b;if(sa->high==sb->high)return strcmp(sa->name,sb->name);elsereturn sb->high-sa->high; } int main(int argc,char **argv) {int cnt,row;scanf("%d%d",&cnt,&row);int div=cnt/row,column=cnt%div+div;student class[10005];for(int i=0;i<cnt;i++)scanf("%s%d",class[i].name,&class[i].high);qsort(class,cnt,sizeof(student),compare);int temp[100005]={0},sum=1,index=0;temp[column/2+1]=index++;for(int i=1;;i++){if(sum>=column)break;temp[column/2+1-i]=index++;sum++;if(sum>=column)break;temp[column/2+1+i]=index++;sum++;}for(int i=1;i<=column;i++)printf("%s%c",class[temp[i]].name,i==column?'\n':' ');for(int i=row-1;i>=1;i--){sum=1;temp[div/2+1]=index++;int offset=1; while(1){if(sum>=div)break;temp[div/2+1-offset]=index++;sum++;if(sum>=div)break;temp[div/2+1+offset]=index++;sum++;offset++;}for(int j=1;j<=div;j++)printf("%s%c",class[temp[j]].name,j==div?'\n':' ');}return EXIT_SUCCESS; }從高到低+字典序升序排列后,每一行安排好對應位置的編號,再依次輸出即可。
1056組合數的和
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) {int cnt; scanf("%d",&cnt);int array[10]={0};for(int i=0;i<cnt;i++)scanf("%d",&array[i]);int sum=0;for(int i=0;i<cnt;i++)for(int j=0;j<cnt;j++){if(i==j)continue;sum+=array[i]*10+array[j];}printf("%d\n",sum);return EXIT_SUCCESS; }so so so so easy。
1057數零壹
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> int main(int argc,char **argv) {char str[100005]={0};scanf("%[^\n]",str);unsigned int sum=0;for(int i=0;i<strlen(str);i++){if(isalpha(str[i])){char ch=tolower(str[i]);sum+=ch-'a'+1;}}int zero=0,one=0;while(sum){if(sum&1)one++;elsezero++;sum>>=1;}printf("%d %d\n",zero,one);return EXIT_SUCCESS; }so so so so easy。
1058選擇題
#include<stdio.h> #include<stdlib.h> #include<string.h> //#define HOST typedef struct {int score;int anssum;int anscnt;char ans[6]; }subject; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt1,cnt2;scanf("%d%d",&cnt1,&cnt2);subject sp[105];for(int i=0;i<cnt2;i++){scanf("%d%d%d",&sp[i].score,&sp[i].anssum,&sp[i].anscnt);for(int j=0;j<sp[i].anscnt;j++)scanf("%*c%c",&sp[i].ans[j]);sp[i].ans[sp[i].anscnt]=0;}int book[105]={0},bookmax=0;while(cnt1--){int sum=0;for(int i=0;i<cnt2;i++){while(getchar()!='(');int xuan;char xuanans[6]={0};scanf("%d",&xuan);for(int j=0;j<xuan;j++)scanf("%*c%c",&xuanans[j]);getchar();if(xuan!=sp[i].anscnt||strcmp(xuanans,sp[i].ans)){book[i]++;if(book[i]>bookmax)bookmax=book[i];continue;}sum+=sp[i].score;}printf("%d\n",sum);}if(!bookmax)printf("Too simple\n");else{printf("%d",bookmax);for(int i=0;i<cnt2;i++)if(book[i]==bookmax)printf(" %d",i+1);putchar('\n');}return EXIT_SUCCESS; }比對學生答案的字符串與標準字符串是否一致即可。
1059C語言競賽
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<math.h> //#define HOST bool check(int num) {int i;for(i=2;i<=(int)sqrt(num);i++)if(num%i==0)break;if(i>(int)sqrt(num))return true;return false; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,ID[10005]={0}; scanf("%d",&cnt);for(int i=1;i<=cnt;i++){int temp;scanf("%d",&temp);ID[temp]=i; }scanf("%d",&cnt);while(cnt--){int temp;scanf("%d",&temp);if(!ID[temp])printf("%04d: Are you kidding?\n",temp);else if(ID[temp]==-1)printf("%04d: Checked\n",temp);else{if(ID[temp]==1)printf("%04d: Mystery Award\n",temp);else if(check(ID[temp]))printf("%04d: Minion\n",temp);elseprintf("%04d: Chocolate\n",temp);ID[temp]=-1;}}return EXIT_SUCCESS; }so easy。
1060愛丁頓數
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int compare(const void *a,const void *b) {return *(const int*)b-*(const int*)a; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt; scanf("%d",&cnt);int array[100005];for(int i=0;i<cnt;i++)scanf("%d",&array[i]);qsort(array,cnt,sizeof(int),compare);int i;for(i=0;i<cnt;i++)if(array[i]<=i+1){printf("%d\n",i);break;}if(i==cnt)printf("%d\n",i);return EXIT_SUCCESS; }遞減排序后,遍歷查找第一個不符合 array[i] > i+1 的位置輸出即可。不要忘記全都滿足的情況,測試點3就是此情況。
1061判斷題
#include<stdio.h> #include<stdlib.h> //#define HOST _Bool ans[105]; int score[105]={0}; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint stnum,tinum;scanf("%d%d",&stnum,&tinum);for(int i=1;i<=tinum;i++)scanf("%d",&score[i]);for(int i=1;i<=tinum;i++)scanf("%hd",&ans[i]);while(stnum--){int temp,sum=0;for(int i=1;i<=tinum;i++){scanf("%d",&temp);if(temp==ans[i])sum+=score[i];}printf("%d\n",sum);}return EXIT_SUCCESS; }so so so so easy。
1062最簡分數
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<stdbool.h> //#define HOST int gcd(int m,int n) {return (m%n?(gcd(n,m%n)):(n)); } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint zi1,zi2,mu1,mu2,aim;scanf("%d/%d",&zi1,&mu1);scanf("%d/%d",&zi2,&mu2);scanf("%d",&aim);double qzi1=(zi1*((double)aim/(double)mu1));double qzi2=(zi2*((double)aim/(double)mu2));if(qzi1>qzi2){double temp=qzi1;qzi1=qzi2;qzi2=temp;}zi1=(int)floor(qzi1);zi2=(int)ceil(qzi2);bool ok=false;for(int i=zi1+1;i<zi2;i++){int temp=gcd(i,aim);if(temp==1)if(ok==false)printf("%d/%d",i,aim),ok=true;elseprintf(" %d/%d",i,aim);}putchar('\n');return EXIT_SUCCESS; }小坑。注意是兩分數之間,并不包括兩分數。
1063計算譜半徑
#include<stdio.h> #include<stdlib.h> #include<math.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,a,b;double maxp=0.0;scanf("%d",&cnt);while(cnt--){scanf("%d%d",&a,&b);double temp=sqrt(a*a+b*b);if(temp>maxp)maxp=temp; }printf("%.2lf\n",maxp);return EXIT_SUCCESS; }so so so so easy。
1064朋友數
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int getsum(int num) {int sum=0;while(num){sum+=num%10;num/=10;}return sum; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,ind=0;scanf("%d",&cnt);bool sp[50]={false};while(cnt--){int temp;scanf("%d",&temp);temp=getsum(temp);if(sp[temp]==false){sp[temp]=true;ind++;}}printf("%d\n",ind);bool ok=false;for(int i=0;i<50;i++)if(sp[i])if(ok==false)printf("%d",i),ok=true;elseprintf(" %d",i);putchar('\n');return EXIT_SUCCESS; }so so so so easy。
1065單身狗
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int couple[1000000]={0}; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,sum=0;scanf("%d",&cnt);while(cnt--){int a,b;scanf("%d%d",&a,&b);couple[a]=b+1;couple[b]=a+1;}scanf("%d",&cnt);while(cnt--){int temp;scanf("%d",&temp);if(couple[temp]>0)couple[temp]=0;elsecouple[temp]=-1,sum++;}for(int i=0;i<=99999;i++)if(couple[i]>0&&couple[couple[i]-1]==0)couple[couple[i]-1]=-1,sum++;bool ok=false;printf("%d\n",sum);for(int i=0;i<=99999;i++)if(couple[i]==-1)if(ok==false)printf("%05d",i),ok=true;elseprintf(" %05d",i);return EXIT_SUCCESS; }微坑。一個單身狗都沒有時,單身狗ID行應為空,所以不能在末尾加回車。
1066圖像過濾
#include<stdio.h> #include<stdlib.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint m,n,left,right,replace;scanf("%d%d%d%d%d",&m,&n,&left,&right,&replace);for(int i=0;i<m;i++)for(int j=0;j<n;j++){int temp;scanf("%d",&temp);if(temp>=left&&temp<=right)temp=replace;printf("%03d%c",temp,j==n-1?'\n':' ');}return EXIT_SUCCESS; }so so so so easy。
1067試密碼
#include<stdio.h> #include<stdlib.h> #include<string.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt;char ans[25]={0};scanf("%s",ans);scanf("%d",&cnt);while(cnt){char temp[250]={0};scanf("%*c%[^\n]",temp);if(temp[0]=='#'&&strlen(temp)==1)break;if(!strcmp(ans,temp)){printf("Welcome in\n");break;}printf("Wrong password: %s\n",temp);cnt--;}if(!cnt)printf("Account locked\n");return EXIT_SUCCESS; }坑。有幾個需要注意的地方:1.用戶嘗試輸入的密碼大小不確定,稍微開大點;2.用戶嘗試輸入的密碼會包含空白字符;3.輸入只有 ‘ # ’ 的時候退出……不能之判斷第一個字符。
1068萬綠叢中一點紅
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int m,n,limit; int matrix[1005][1005]={0}; bool check(int i,int j) {const int move[8][2]={{-1,-1},{-1,0},{-1,1},{1,-1},{1,0},{1,1},{0,-1},{0,1}};for(int k=0;k<8;k++){int tx=move[k][0]+i;int ty=move[k][1]+j;if(ty<0||ty>=n||tx<0||tx>=m)continue;if(abs(matrix[tx][ty]-matrix[i][j])<=limit)return false;}return true; } bool unique(int num,int x0,int y0) {for(int i=0;i<m;i++)for(int j=0;j<n;j++){if(i==x0&&j==y0)continue;if(matrix[i][j]==num)return false;}return true; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifscanf("%d%d%d",&n,&m,&limit);for(int i=0;i<m;i++)for(int j=0;j<n;j++)scanf("%d",&matrix[i][j]);int sum=0,spi,spj;for(int i=0;i<m;i++)for(int j=0;j<n;j++)if(check(i,j)&&unique(matrix[i][j],i,j))sum++,spi=i,spj=j;if(sum==0)printf("Not Exist\n");else if(sum>1)printf("Not Unique\n");elseprintf("(%d, %d): %d\n",spj+1,spi+1,matrix[spi][spj]);return EXIT_SUCCESS; }沒有C++的map容器,又開不了那么大的數組,只能挨個確定唯一性,好在數據并不大。先確認差值符合再確定唯一性會快一些。
1069微博轉發抽獎
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> //#define HOST char queue[1005][25]={0}; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,jump,begin,sp=0;scanf("%d%d%d",&cnt,&jump,&begin);for(int i=1;i<=cnt;i++){char temp[25]={0};scanf("%s",temp);if(i==begin){bool go=false;for(int j=0;j<sp;j++)if(!strcmp(temp,queue[j])){begin++;go=true;break;}if(go)continue;begin+=jump;printf("%s\n",temp);strcpy(queue[sp++],temp);}}if(!sp)printf("Keep going...\n");return EXIT_SUCCESS; }so easy。
1070結繩
#include<stdio.h> #include<stdlib.h> //#define HOST int compare(const void *a,const void *b) {return *(const int*)a-*(const int*)b; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt; scanf("%d",&cnt);int array[10005]={0};for(int i=1;i<=cnt;i++)scanf("%d",&array[i]);qsort(array+1,cnt,sizeof(int),compare);double lenth=(double)array[1];for(int i=2;i<=cnt;i++)lenth=lenth/2.0+array[i]/2.0;printf("%d\n",(int)lenth);return EXIT_SUCCESS; }想要取到所有繩子的最大長度,要保證最長的繩子減半的次數最少。排序后計算便是。
1071小賭怡情
#include<stdio.h> #include<stdlib.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint all,cnt;scanf("%d%d",&all,&cnt);while(cnt--){int a,b,sp,push;scanf("%d%d%d%d",&a,&sp,&push,&b);if(push>all){printf("Not enough tokens. Total = %d.\n",all);continue;}if((!sp&&a>b)||(sp&&a<b)){all+=push;printf("Win %d! Total = %d.\n",push,all);}if((sp&&a>b)||(!sp&&a<b)){all-=push;printf("Lose %d. Total = %d.\n",push,all);}if(all<=0){printf("Game Over.\n");break;}}return EXIT_SUCCESS; }so so easy。
1072開學寄語
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,items; scanf("%d%d",&cnt,&items);bool item[10000]={false};while(items--){int temp;scanf("%d",&temp);item[temp]=true;}int stu=0,goods=0;while(cnt--){char name[10]={0};int index,book[10]={0},z=0;scanf("%s%d",name,&index);while(index--){int temp;scanf("%d",&temp);if(item[temp]){book[z++]=temp;goods++;}}if(z){stu++;printf("%s:",name);for(int i=0;i<z;i++)printf(" %04d",book[i]);putchar('\n');}}printf("%d %d\n",stu,goods);return EXIT_SUCCESS; }so so easy。
1073多選題常見計分法
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<stdbool.h> #define Max(a,b) (a>b?(a):(b)) //#define HOST typedef struct {int score;int anssum;int anscnt;bool ans[6]; }subject; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt1,cnt2;scanf("%d%d",&cnt1,&cnt2);subject sp[105];for(int i=0;i<cnt2;i++){scanf("%d%d%d",&sp[i].score,&sp[i].anssum,&sp[i].anscnt);for(int j=0;j<sp[i].anssum;j++)sp[i].ans[j]=false;for(int j=0;j<sp[i].anscnt;j++){char temp;scanf("%*c%c",&temp);sp[i].ans[temp-'a']=true;}}int book[105][6]={0},bookmax=0;while(cnt1--){double sum=0.0;for(int i=0;i<cnt2;i++){while(getchar()!='(');int xuan;char xuanans[6]={0};bool zero=false;scanf("%d",&xuan);for(int j=0;j<sp[i].anssum;j++)if(sp[i].ans[j]==true)book[i][j]++;for(int j=0;j<xuan;j++){char temp;scanf("%*c%c",&temp);if(sp[i].ans[temp-'a']==true)book[i][temp-'a']--;else{zero=true;book[i][temp-'a']++;}}getchar();if(xuan==sp[i].anscnt&&zero==false)sum+=(double)sp[i].score;else if(xuan!=sp[i].anscnt&&zero==false)sum+=(double)sp[i].score/2.0;}printf("%.1lf\n",sum);}for(int i=0;i<cnt2;i++)for(int j=0;j<6;j++)bookmax=Max(bookmax,book[i][j]);if(!bookmax)printf("Too simple\n");else{for(int i=0;i<cnt2;i++)for(int j=0;j<6;j++)if(book[i][j]==bookmax)printf("%d %d-%c\n",bookmax,i+1,j+'a');}return EXIT_SUCCESS; }一道很麻煩的模擬題,由 1058 改編而成。需注意錯題不單單是錯誤的選項,對的選項沒選也算錯誤。
1074宇宙無敵加法器
#include<stdio.h> #include<stdlib.h> #include<string.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifchar biao[20]={0};char biga[20]={0};char bigb[20]={0};char ans[50]={0};scanf("%s%s%s",biao,biga,bigb);int lenbiao=strlen(biao),lena=strlen(biga),lenb=strlen(bigb);int index=0;while(index<lena||index<lenb){int a,b,c;if(index>=lena)a=0;elsea=biga[lena-index-1]-'0';if(index>=lenb)b=0;elseb=bigb[lenb-index-1]-'0';if(biao[lenbiao-index-1]=='0')c=10;elsec=biao[lenbiao-index-1]-'0';ans[index]+=a+b;if(ans[index]>=c){ans[index]-=c;ans[index+1]++;}ans[index++]+='0';}if(ans[index])ans[index]+='0';elseindex--;while(ans[index]=='0')index--;for(int i=index;i>=0;i--)putchar(ans[i]);if(index<0)putchar('0'); putchar('\n');return EXIT_SUCCESS; }小坑。結果是 0 的時候確保輸出一個 0 。
1075鏈表元素分類
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST struct {int data,next; }node[100005]; int arr[100005][3]={0}; int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint st,n,k,ip;scanf("%d%d%d",&st,&n,&k);for(int i=0;i<n;i++){scanf("%d",&ip);scanf("%d%d",&node[ip].data,&node[ip].next);}int point=st,index[3]={0};while(point!=-1){int data=node[point].data;if(data<0)arr[index[0]++][0]=point;else if(data>=0&&data<=k)arr[index[1]++][1]=point;elsearr[index[2]++][2]=point;point=node[point].next;}bool fb=true;for(int i=0;i<3;i++){for(int j=0;j<index[i];j++){if(fb){printf("%05d %d ",arr[j][i],node[arr[j][i]].data);fb=false;}elseprintf("%05d\n%05d %d ",arr[j][i],arr[j][i],node[arr[j][i]].data); }}printf("-1");return EXIT_SUCCESS; }存儲鏈表后,從鏈表頭開始遍歷依次存下 <0、0<=&&<=k、>k 的地址。
按上面的順序依次輸出地址和數據。
1076Wifi密碼
#include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc,char **argv) {int cnt,ins;scanf("%d",&cnt);int ans[105]={0};for(ins=0;ins<cnt;ins++){char alpha,is='F';while(is!='T')scanf("%*c%c-%c",&alpha,&is);ans[ins]=alpha-'A'+1;}for(cnt=0;cnt<ins;cnt++)putchar('0'+ans[cnt]);putchar('\n');return EXIT_SUCCESS;}so so so easy。
1077互評成績計算
#include<stdio.h> #include<stdlib.h> #include<math.h> #define Max(a,b) (a<b?(b):(a)) #define Min(a,b) (a<b?(a):(b)) //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,maxs;scanf("%d%d",&cnt,&maxs);for(int i=1;i<=cnt;i++){int teacher,max=0,min=1<<30,sum=0,div=cnt-3;scanf("%d",&teacher);for(int j=1;j<cnt;j++){int temp;scanf("%d",&temp);if(temp<0||temp>maxs){div--;continue;}sum+=temp;max=Max(max,temp);min=Min(min,temp);}sum-=max;sum-=min;sum=(int)round(((double)sum/div+(double)teacher)/2.0);printf("%d\n",sum);}return EXIT_SUCCESS; }so so so easy。
1078字符串壓縮與解壓
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include<ctype.h> //#define HOST void ya(char *str) {int i=0,len=strlen(str),nowlen=0;char sp=str[0];while(i<len){if(sp==str[i]){nowlen++;}else{if(nowlen>1)printf("%d",nowlen);putchar(sp);nowlen=1;sp=str[i];}i++;}if(nowlen>1)printf("%d",nowlen);putchar(sp);return; } void jie(char *str) {int i=0,len=strlen(str);char sp,temp;while(i<len){sp=str[i];if(isdigit(sp)){i++;int num=sp-'0';while(isdigit(str[i])){num=num*10+str[i]-'0';i++;}temp=str[i];for(int k=1;k<=num;k++)putchar(temp);}elseputchar(sp);i++;}return; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifchar ch,str[1005]={0};ch=getchar();scanf("%*c%[^\n]%*c",str);if(ch=='C')ya(str);elsejie(str);putchar('\n');return EXIT_SUCCESS; }so so easy。上學期ACM校賽的一個簽到題。
1079延遲的回文數
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> //#define HOST bool check(char *num) {int left=0,right=strlen(num)-1;while(left<right){if(num[left]!=num[right])return false;left++;right--;}return true; } char* transform(char *num) {static char spnum[1200]={0};int left=0,right=strlen(num)-1,index=0;for(int i=right;i>=left;i--)spnum[index++]=num[i];return spnum; } char* Bigadd(char *num1,char *num2) {int len=strlen(num1),i,j;static char sumnum[1200]={0};memset(sumnum,0,sizeof(sumnum));for(i=len;i>0;i--){sumnum[i]+=num1[i-1]+num2[i-1]-2*'0';if(sumnum[i]>=10){sumnum[i-1]++;sumnum[i]-=10;}}if(sumnum[0])i=1;for(j=0;j<=len;j++)sumnum[j]+='0';sumnum[j]=0;//printf(">>>%s %d\n",sumnum,i);if(!i)return (sumnum+1);return sumnum; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt=10;char num[1200]={0};scanf("%s",num);if(check(num))printf("%s is a palindromic number.\n",num);else{ while(cnt--){char *temp1=transform(num); char *temp2=Bigadd(num,temp1);printf("%s + %s = %s\n",num,temp1,temp2);strcpy(num,temp2);if(check(temp2))break;}if(cnt>-1)printf("%s is a palindromic number.\n",num);elseprintf("Not found in 10 iterations.\n");}return EXIT_SUCCESS; }大整數高精度運算這塊總是寫的很麻煩。。重復的翻轉總怕出錯。
1080MOOC期終成績
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include<math.h> //#define HOST typedef struct {char name[25];int sum,gp,gm,gf; }student; typedef struct {char name[25];int gnum; }studentcopy; student sp[10005]={0}; studentcopy sp2[10005]={0},sp3[10005]={0}; void getsp(int cnt1,int cnt2,int cnt3) {int ks=0,ls=0;for(int i=0;i<cnt1;i++){while(strcmp(sp[i].name,sp2[ks].name)>0&&ks<cnt2)ks++;while(strcmp(sp[i].name,sp3[ls].name)>0&&ls<cnt3)ls++;sp[i].gm=-1;if(strcmp(sp[i].name,sp2[ks].name)==0)sp[i].gm=sp2[ks].gnum;if(strcmp(sp[i].name,sp3[ls].name)==0)sp[i].gf=sp3[ls].gnum;if(sp[i].gm>sp[i].gf)sp[i].sum=(int)round(0.4*sp[i].gm+0.6*sp[i].gf);elsesp[i].sum=sp[i].gf;} } int compare(const void *a,const void *b) {const student *sa=(const student*)a;const student *sb=(const student*)b;if(sa->sum==sb->sum)return strcmp(sa->name,sb->name);return sb->sum-sa->sum; } int comforsp(const void *a,const void *b) {const student *sa=(const student*)a;const student *sb=(const student*)b;return strcmp(sa->name,sb->name); } int comforcopy(const void *a,const void *b) {const studentcopy *sa=(const studentcopy*)a;const studentcopy *sb=(const studentcopy*)b;return strcmp(sa->name,sb->name); } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt1,cnt2,cnt3;scanf("%d%d%d",&cnt1,&cnt2,&cnt3);char str[25]={0};int index1=0,index2=0,index3=0;while(cnt1--){int temp;scanf("%s%d",sp[index1].name,&temp);if(temp>=200)sp[index1++].gp=temp;}while(cnt2--){scanf("%s%d",sp2[index2].name,&sp2[index2].gnum);index2++;}while(cnt3--){scanf("%s%d",sp3[index3].name,&sp3[index3].gnum);index3++;}qsort(sp,index1,sizeof(student),comforsp);qsort(sp2,index2,sizeof(studentcopy),comforcopy);qsort(sp3,index3,sizeof(studentcopy),comforcopy);getsp(index1,index2,index3);qsort(sp,index1,sizeof(student),compare);for(int i=0;i<index1;i++){if(sp[i].sum>=60){printf("%s",sp[i].name);printf(" %d",sp[i].gp);if(sp[i].gm!=-1)printf(" %d",sp[i].gm);elseprintf(" -1");printf(" %d",sp[i].gf);printf(" %d\n",sp[i].sum);}}return EXIT_SUCCESS; }坑坑坑坑坑坑坑坑坑坑!!!坑到爆炸!
純C處理這種大規模可重復數據真的是太麻煩了,直接線性搜索名稱最后一個測試點穩穩地超時。
解決方法是多開兩個結構體數組用來存儲期中、期末考試成績,以 >=200分 的上機成績作為參考,排序三個成績的名稱后,按順序補全作為結果的結構體數組中的期中、期末成績。
我的想法是找到同名的就把成績復制過去,沒成績的就是 0 ,最后輸出的時候過濾總成績 <60 分的,期中考試是 0 的輸出 -1 就是了。
結果。。最后一個測試點一直是WA??折騰了老一番,怎么改都不對。。
吃了頓飯冷靜了下,發現期中考試會有家伙參加考試,然后考了個 0 分的。。。
2333,長教訓了,算是自己邏輯不周吧。。
另>>:做出來竟然比用STL庫 map 快。
1081檢查密碼
#include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<string.h> int main(int argc,char **argv) {int cnt,inx;scanf("%d",&cnt);while(cnt--){char str[100]={0};scanf("%*c%[^\n]",str);if(strlen(str)<6){printf("Your password is tai duan le.\n");continue;}int h1=0,h2=0,flag=0;for(inx=0;inx<strlen(str);inx++){if(!(isalnum(str[inx])||str[inx]=='.')){printf("Your password is tai luan le.\n");flag=1;break;}if(isalpha(str[inx]))h1=1;if(isdigit(str[inx]))h2=1; }if(flag)continue;if(h1==0&&h2==1)printf("Your password needs zi mu.\n");if(h2==0&&h1==1)printf("Your password needs shu zi.\n");if(h1==1&&h2==1)printf("Your password is wan mei.\n");}return EXIT_SUCCESS; }小坑,密碼串可能有空格。
1082射擊比賽
#include<stdio.h> #include<stdlib.h> #include<stdint.h> #define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt; scanf("%d",&cnt);int bestID,worseID,bs=INT32_MAX,ws=0;while(cnt--){int temp,x,y;scanf("%d%d%d",&temp,&x,&y);x=x*x+y*y;if(x>ws){ws=x;worseID=temp;}if(x<bs){bs=x;bestID=temp;}} printf("%04d %04d\n",bestID,worseID); return EXIT_SUCCESS; }so so so so easy。
1083是否存在相等的差
#include<stdio.h> #include<stdlib.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,arr[10005]={0}; scanf("%d",&cnt);for(int i=1;i<=cnt;i++){int temp;scanf("%d",&temp);arr[abs(temp-i)]++;}for(int i=10000;i>=0;i--)if(arr[i]>1)printf("%d %d\n",i,arr[i]);return EXIT_SUCCESS; }so so so so easy。
1084外觀數列
#include<stdio.h> #include<stdlib.h> #include<string.h> //#define HOST char* tran(char* arr,int len) {static char q[100000]={0};memset(q,0,sizeof(q));int index=0,isp=0,sp=0,take=arr[0];while(index<len){if(take==arr[index])sp++;else{q[isp++]=take;int left=isp,right=isp-1;while(sp){q[isp++]=sp%10+'0';sp/=10;right++;}while(left<right){int temp=q[left];q[left]=q[right];q[right]=temp;left++,right--;}take=arr[index];sp=1;}index++;}q[isp++]=take;int left=isp,right=isp-1;while(sp){q[isp++]=sp%10+'0';sp/=10;right++; }while(left<right){int temp=q[left];q[left]=q[right];q[right]=temp;left++,right--;}return q; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,k;char array[100000]={0};scanf("%d%d",&cnt,&k);array[0]=cnt+'0';for(int i=1;i<k;i++){char *point=tran(array,strlen(array)); strcpy(array,point); //printf("%d>>%s\n",i+1,array);}printf("%s\n",array); return EXIT_SUCCESS; }不能小看 N 最大只有 40 ,d=2 N=40 的時候,上萬位都打不住。
1085PAT單位排行
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #include<math.h> //#define HOST typedef struct {char isp;double score;char name[20];int stnum,iscore; }unit; unit sp[100005]={0},ans[100005]={0}; int namecompare(const void *a,const void *b) {const unit *sa=(const unit*)a;const unit *sb=(const unit*)b;return strcmp(sa->name,sb->name); } int anscompare(const void *a,const void *b) {const unit *sa=(const unit*)a;const unit *sb=(const unit*)b;if(sa->iscore==sb->iscore){if(sa->stnum==sb->stnum)return strcmp(sa->name,sb->name);return sa->stnum-sb->stnum;}return sb->iscore-sa->iscore; } void ges(char mode,double *to,double *from) {if(mode=='T')*to+=*from*1.5;if(mode=='A')*to+=*from;if(mode=='B')*to+=*from/1.5;return; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,index=0; scanf("%d",&cnt);while(cnt--){char ch,temp[10]={0};while((ch=getchar())=='\n');sp[index].isp=ch;scanf("%*s");scanf("%lf",&sp[index].score);scanf("%s",temp);for(int i=0;i<strlen(temp);i++)temp[i]=tolower(temp[i]);strcpy(sp[index].name,temp);index++;}qsort(sp,index,sizeof(unit),namecompare);int ind=0,jnd=0;while(jnd<index){strcpy(ans[ind].name,sp[jnd].name);ans[ind].stnum=1;ges(sp[jnd].isp,&ans[ind].score,&sp[jnd].score);ind++,jnd++;int cut=1;while(jnd<index&&(!strcmp(ans[ind-cut].name,sp[jnd].name))){ans[ind-cut].stnum++;ges(sp[jnd].isp,&ans[ind-cut].score,&sp[jnd].score);jnd++;if(jnd>=index)break;}ans[ind-1].iscore=(int)floor(ans[ind-1].score);}qsort(ans,ind,sizeof(unit),anscompare);int qt=0,diff=-1,qr=1;printf("%d\n",ind);for(int i=0;i<ind;i++){if(diff!=ans[i].iscore){diff=ans[i].iscore; qt+=qr;qr=1;}elseqr++;printf("%d %s %d %d\n",qt,ans[i].name,ans[i].iscore,ans[i].stnum);}return EXIT_SUCCESS; }C語言雞肋的時候到了,什么輔助數據結構也沒有,只能用結構體數組從頭構建。處理加權分數的時候最后轉成整形變量,后面的排序輸出會方便很多,還不會出莫名其妙的錯誤。
1086就不告訴你
#include<stdio.h> #include<stdlib.h> //#define HOST void print(int num) {while(num%10==0)num/=10;while(num){putchar(num%10+'0');num/=10;}putchar('\n');return; } int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint a,b;scanf("%d%d",&a,&b);print(a*b); return EXIT_SUCCESS; }so so so so easy。
1087有多少不同的值
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,sum=0;int book[10400]={false};scanf("%d",&cnt);for(int i=1;i<=cnt;i++){int index=i/2+i/3+i/5;if(book[index]==false){sum++;book[index]=true;}}printf("%d\n",sum); return EXIT_SUCCESS; }so so so so easy。
1088三人行
#include<stdio.h> #include<stdlib.h> #include<math.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint my,x,y;scanf("%d%d%d",&my,&x,&y);for(int jia=99;jia>=10;jia--){int yi=jia%10*10+jia/10;double bing=(double)yi/(double)y;if(fabs(bing-(fabs((double)jia-(double)yi))/x)<1e-6){printf("%d",jia);if(jia>my)printf(" Cong");if(jia==my)printf(" Ping");if(jia<my)printf(" Gai");if(yi>my)printf(" Cong");if(yi==my)printf(" Ping");if(yi<my)printf(" Gai");if(bing>my)printf(" Cong\n");if(bing==my)printf(" Ping\n");if(bing<my)printf(" Gai\n");return EXIT_SUCCESS; }}printf("No Solution\n");return EXIT_SUCCESS; }so easy。
1089狼人殺-簡單版
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> //#define HOST int main(int argc,char **argv) {#ifdef HOSTfreopen("input.txt","r",stdin);#endifint cnt,index,book[105]={0},sp[105]={0},ans[105];bool get=true;scanf("%d",&cnt);for(int i=1;i<=cnt;i++)scanf("%d",&book[i]);for(int i=1;i<cnt;i++){for(int j=i+1;j<=cnt;j++){memset(sp,0,sizeof(sp));sp[i]=sp[j]=-1;ans[0]=ans[1]=0;index=0;for(int k=1;k<=cnt;k++){if((sp[abs(book[k])]==0&&book[k]<0)||(sp[book[k]]==-1&&book[k]>0))ans[index++]=k;}if(index==2&&(sp[ans[0]]==0&&sp[ans[1]]==-1||sp[ans[1]]==0&&sp[ans[0]]==-1)){printf("%d %d\n",i,j);get=false;break;}}if(get==false)break;}if(get)printf("No Solution\n");return EXIT_SUCCESS; }枚舉法。先嘗試了下枚舉撒謊的,發現很難判斷是否正確的說出了狼人是哪兩個,折騰半天失敗告終…555…555…
枚舉狼人就很簡單了,誰說得和預設狼人不符,那么說的就是假話。再判斷下是不是只有一個狼人說了假話就是了。
1090危險品裝箱
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> int sp[100000][105]={0}; int main(int argc,char **argv) {int cnt1,cnt2;scanf("%d%d",&cnt1,&cnt2);while(cnt1--){int a,b;scanf("%d%d",&a,&b);sp[a][sp[a][0]+1]=b;sp[a][0]++;}while(cnt2--){bool book[100000]={false};int array[10001]={0};int cnt,pass=0;scanf("%d",&cnt);int num=0;while(cnt--){scanf("%d",&array[num]);for(int index=1;index<=sp[array[num]][0];index++)book[sp[array[num]][index]]=true;num++;}for(int i=0;i<num;i++)if(book[array[i]])pass=1;if(pass)printf("No\n");elseprintf("Yes\n");}return EXIT_SUCCESS; }用二維數組先存儲每個編號對應的若干個編號,sp[編號][0]存儲總共對應著幾個。
用布爾數組統計每個輸入的所有不相容編號,之后查詢如果有矛盾輸出No,否則Yes。
看了看其他人做的,大多用的STL容器,自己對STL庫的掌握還需要努力啊……
>>以下5題為2018/12/09PAT參賽時所寫
1091N-自守數
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include<math.h> bool check(long long a,int b) {int ts=0;if(b/10==0)ts=1;else if(b/100==0)ts=2;elsets=3;int isp=a%(int)pow(10,ts);if(isp==b)return true;return false; } int main(int argc,char **argv) {//freopen("test.txt","r",stdin);int cnt;scanf("%d",&cnt);while(cnt--){int temp;bool jump=false;scanf("%d",&temp);int i,j;for(i=1;i<10;i++){long long sp=(long long)i*temp*temp;if(check(sp,temp)){printf("%d %lld\n",i,sp);break;}}if(i==10)printf("No\n");}return EXIT_SUCCESS; }so easy
1092最好吃的月餅
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> int mat[1005]={0}; int max[1005]={0}; int maxmoon=0; int main(int argc, char *argv[]) {int cnt,city,sp=0;scanf("%d%d",&cnt,&city);int is,js,i;for(is=1;is<=city;is++){for(js=1;js<=cnt;js++){if(is==1)scanf("%d",&mat[js]);else{int temp;scanf("%d",&temp);mat[js]+=temp;}}}for(js=1;js<=cnt;js++){if(mat[js]>maxmoon){maxmoon=mat[js];sp=0;max[sp++]=js;}else if(mat[js]==maxmoon){max[sp++]=js;}}printf("%d\n",maxmoon);for(i=0;i<sp;i++)printf("%d%c",max[i],i==sp-1?'\n':' ');return 0; }統計每個城市的和,取最大值遍歷。
1093字符串A+B
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> char str1[1000005]={0}; short int sp[128]={0}; char str2[1000005]={0}; int main(int argc, char *argv[]) {//freopen("test.txt","r",stdin);scanf("%[^\n]%*c",str1);scanf("%[^\n]%*c",str2);int i;for(i=0;i<strlen(str1);i++){int temp=str1[i];if(sp[temp]==0)sp[temp]=1;else if(sp[temp]==1)sp[temp]=2;}for(i=0;i<strlen(str2);i++){int temp=str2[i];if(sp[temp]==0)sp[temp]=1;else if(sp[temp]==1)sp[temp]=2;}for(i=0;i<strlen(str1);i++){int temp=str1[i];if(sp[temp]!=10){putchar(str1[i]);if(sp[temp]==2)sp[temp]=10;}}for(i=0;i<strlen(str2);i++){int temp=str2[i];if(sp[temp]!=10){putchar(str2[i]);if(sp[temp]==2)sp[temp]=10;}}putchar('\n');return 0; }考試時寫的有點兒亂,循環里的變量都定義在了外面,怕不支持C99。
統計出現兩次的字符,這些字符只能打印一次。
1094谷歌的招聘
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include<math.h> int check(int num) {int i;if(num<2)return false;for(i=2;i<=(int)sqrt(num);i++){if(num%i==0)return false;}return true; } int getff(int num) {int i=0;while(num){num/=10;i++;}return i; } int main(int argc,char **argv) {//freopen("test.txt","r",stdin);int len,cnt;scanf("%d%d",&len,&cnt);char number[1005]={0};scanf("%s",number);int i,j;for(i=0;i<=len-cnt;i++){int temp=0;;for(j=0;j<cnt;j++){temp*=10;temp+=number[i+j]-'0';}if(check(temp)){int k;for(k=1;k<=cnt-getff(temp);k++)printf("0");printf("%d\n",temp);break;}}if(i==len-cnt+1)printf("404\n");return EXIT_SUCCESS; }挨個取數字判斷是否為素數即可。
小坑,不要忘了題目中說的保留前導零。
1095解碼PAT準考證
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> typedef struct {char rank;int kid;int date;int mid;int score; }student; student sp[10005]={0}; int compare(const void *a,const void *b) {const student *sa=(const student*)a;const student *sb=(const student*)b;if(sa->score==sb->score){if(sa->rank==sb->rank){if(sa->kid==sb->kid){if(sa->date==sb->date){return sa->mid-sb->mid;}return sa->date-sb->date;}return sa->kid-sb->kid;}return sa->rank-sb->rank;}return sb->score-sa->score; } int main(int argc, char *argv[]) {//freopen("test.txt","r",stdin);int N,M;scanf("%d%d",&N,&M);int i;for(i=0;i<N;i++){char temp[20]={0};scanf("%s",temp);sscanf(temp,"%c%3d%6d%d",&sp[i].rank,&sp[i].kid,&sp[i].date,&sp[i].mid);scanf("%d",&sp[i].score);}qsort(sp,N,sizeof(student),compare);int j;for(j=1;j<=M;j++){int number,temp;char ctemp;scanf("%d",&number);switch(number){case 1:while((ctemp=getchar())==' ');printf("Case %d: %d %c\n",j,number,ctemp);{int i;bool isq=false;for(i=0;i<N;i++){if(sp[i].rank==ctemp){printf("%c%03d%06d%03d %d\n",sp[i].rank,sp[i].kid,sp[i].date,sp[i].mid,sp[i].score);isq=true; }}if(isq==false)printf("NA\n");}break;case 2:scanf("%d",&temp);printf("Case %d: %d %03d\n",j,number,temp);{int i,sumstu=0,sumscore=0;for(i=0;i<N;i++){if(sp[i].kid==temp){sumstu++;sumscore+=sp[i].score;}}if(!sumstu)printf("NA\n");elseprintf("%d %d\n",sumstu,sumscore);}break;case 3:scanf("%d",&temp);printf("Case %d: %d %06d\n",j,number,temp);{int i,ksp[1000]={0},max=0;bool isha=false;for(i=0;i<N;i++){if(sp[i].date==temp){isha=true;ksp[sp[i].kid]++;if(ksp[sp[i].kid]>max)max=ksp[sp[i].kid];}}for(i=max;i>0;i--){int j;for(j=101;j<=999;j++)if(ksp[j]==i){printf("%d %d\n",j,i);}}if(isha==false)printf("NA\n");}break;default:break;}}return 0; }這次考試最麻煩的一道題,要求很多。
每個指令沒輸出都要輸出NA,所有前導零都不可省略。其他的正常來就是了。
END
總結
以上是生活随笔為你收集整理的PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农业产业化发展趋势下人力资源管理浅析
- 下一篇: P93-好玩游戏的物品清单