入門篇(1)—入門模擬c++
1.簡單模擬算法
模擬題主要考察的事代碼能力,簡單模擬不涉及算法,徹底只是根據題目描述來進行代碼的編寫。編程
2.剩餘的樹數組
#include<stdio.h> #include<string.h> int tree[10010]; int main(){ int L,M; while(~scanf("%d%d",&L,&M)){ if(L==0&&M==0) break; memset(tree,0,sizeof(int)); for(int i=0;i<=L;i++){ tree[i]=1; } int s,e; for(int j=0;j<M;j++){ scanf("%d%d",&s,&e); for(int i=s;i<=e;i++){ tree[i]=0; } } int num=0; for(int i=0;i<=L;i++){ if(tree[i]==1) num++; } printf("%d\n",num); } return 0; }
3.石頭剪刀布函數
記錄甲乙贏的次數和平局的次數(平局甲乙相等),計算得出輸的次數,在記錄贏的同時,記下是出什麼贏得本局,最後經過比較得出出哪個贏的概率比較大學習
#include<stdio.h> #include<string.h> int main(){ int n; scanf("%d",&n); int win1=0,los1=0; int win2=0,los2=0; int equ=0; char c1,c2; int x1=0,y1=0,z1=0; int x2=0,y2=0,z2=0; for(int i=0;i<n;i++){ getchar(); scanf("%c %c",&c1,&c2); if(c1=='C'&&c2=='J'||c1=='J'&&c2=='B'||c1=='B'&&c2=='C'){ win1++; if(c1=='C') x1++; else if(c1=='J') y1++; else if(c1=='B') z1++; }else if(c1==c2){ equ++; }else{ win2++; if(c2=='C') x2++; else if(c2=='J') y2++; else if(c2=='B') z2++; } los1=n-win1-equ; los2=n-win2-equ; } printf("%d %d %d\n%d %d %d\n",win1,equ,los1,win2,equ,los2); if(x1==y1&&y1==z1){ printf("B "); }else if(x1>y1&&x1>z1){ printf("C "); }else if(y1>x1&&y1>z1){ printf("J "); }else if(z1>x1&&z1>y1){ printf("B "); }else if(x1==y1&&x1>z1){ printf("C "); }else if(x1==y1&&x1>z1){ printf("C "); }else if(x1==z1&&x1>y1){ printf("B "); }else if(z1==y1&&z1>x1){ printf("B "); } if(x2==y2&&y2==z2){ printf("B\n"); }else if(x2>y2&&x2>z2){ printf("C\n"); }else if(y2>x2&&y2>z2){ printf("J\n"); }else if(z2>x2&&z2>y2){ printf("B\n"); }else if(x2==y2&&x2>z2){ printf("C\n"); }else if(x2==y2&&x2>z2){ printf("C\n"); }else if(x2==z2&&x2>y2){ printf("B\n"); }else if(z2==y2&&z2>x2){ printf("B\n"); } //printf("\n1: %d %d %d\n",x1,y1,z1); //printf("\n2: %d %d %d\n",x2,y2,z2); return 0; }
4.A+B問題(字符串模擬加減運算)測試
問題也是看了別人的博客才寫出來的,這種思路我是沒想到,不得不佩服.網站
參考博客連接:https://blog.csdn.net/zh_ang_lei/article/details/48475651spa
#include<stdio.h> #include<string.h> char s1[20],s2[20]; int len1,len2; int main(){ while(scanf("%s %s",s1,s2)!=EOF){ long long a=0,b=0; len1 = strlen(s1); len2 = strlen(s2); for(int i=0;i<len1;i++){ if(s1[i]>='0'&&s1[i]<='9'){ a=a*10+s1[i]-'0'; } } if(s1[0]=='-'){ a=-a; } for(int i=0;i<len2;i++){ if(s2[i]>='0'&&s2[i]<='9'){ b=b*10+s2[i]-'0'; } } if(s2[0]=='-'){ b=-b; } printf("%lld\n",a+b); } return 0; }
5.特殊乘法.net
不得不說,思路就是制勝的法寶啊,借用上一題的處理思路,本來令我愁眉不解的題瞬間迎刃而解了。
#include<stdio.h> #include<string.h> char s1[20],s2[20]; int len1,len2; int main(){ while(scanf("%s %s",s1,s2)!=EOF){ len1 = strlen(s1); len2 = strlen(s2); long long sum = 0; for(int i=0;i<len1;i++){ for(int j=0;j<len2;j++){ sum+=(s1[i]-'0')*(s2[j]-'0'); } } printf("%lld\n",sum); } return 0; }
//ps:coudup網站出現故障,因此下面的題目選用了南陽理工學院的oj上的題
6.蛇形填數(經典模擬)
題目連接:http://acm.nyist.cf/problem/33
這題我沒有寫出來,參照別人的代碼AC
參照地址:https://blog.csdn.net/qq_36238595/article/details/53537672
#include<stdio.h> #include<string.h> int a[101][101]; int main(){ int n; scanf("%d",&n); int x=0,y=n-1;//行列 int num=1;//填入的數 a[x][y]=1;//填入第一個數 while(num<n*n){//結束條件 while(x+1<n&&!a[x+1][y]){//向下填數,條件爲:不超邊界,且未填入數 a[++x][y]=++num; } while(y-1>=0&&!a[x][y-1]){//向左 a[x][--y]=++num; } while(x-1>=0&&!a[x-1][y]){//向上 a[--x][y]=++num; } while(y+1<n&&!a[x][y+1]){//向右 a[x][++y]=++num; } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ printf("%d ",a[i][j]); } printf("\n"); } return 0; }
7.排序去重(數據比較小的狀況下)
題目連接:http://acm.nyist.cf/problem/48
本題利用桶排序的思想,在數組容許的範圍內可以使用。
#include<stdio.h> #include<string.h> #define max 1001 int a[max]; int main(){ int n,k; int sum=0; scanf("%d",&n); memset(a,0,sizeof(a)); for(int i=0;i<n;i++){ scanf("%d",&k); a[k]++; } for(int i=0;i<max;i++){ if(a[i]) sum++; } printf("%d\n",sum); for(int j=0;j<max;j++){ if(a[j]) printf("%d ",j); } return 0; }
8.升級版石頭剪刀布
題目連接:http://acm.nyist.cf/problem/1346
#include<stdio.h> int main(){ int a[3000],b[3000]; int n,na,nb; while(scanf("%d%d%d",&n,&na,&nb)!=EOF){ int wa=0,wb=0; for(int i=0;i<na;i++){ scanf("%d",&a[i]); } int ma=na; for(int j=0;j<n/na+2;j++){//複製字符串,到須要的程度 for(int i=0;i<na;i++){ a[ma++]=a[i]; } } for(int i=0;i<nb;i++){ scanf("%d",&b[i]); } int mb=nb; for(int j=0;j<n/nb+2;j++){ for(int i=0;i<nb;i++){ b[mb++]=b[i]; } } for(int i=0;i<n;i++){//判斷輸贏 if(a[i]==0&&b[i]==2||a[i]==0&&b[i]==3||a[i]==1&&b[i]==0||a[i]==1&&b[i]==3||a[i]==2&&b[i]==1||a[i]==2&&b[i]==4||a[i]==3&&b[i]==2||a[i]==3&&b[i]==4||a[i]==4&&b[i]==0||a[i]==4&&b[i]==1) wa++; if(b[i]==0&&a[i]==2||b[i]==0&&a[i]==3||b[i]==1&&a[i]==0||b[i]==1&&a[i]==3||b[i]==2&&a[i]==1||b[i]==2&&a[i]==4||b[i]==3&&a[i]==2||b[i]==3&&a[i]==4||b[i]==4&&a[i]==0||b[i]==4&&a[i]==1) wb++; } printf("%d %d\n",wa,wb); } return 0; }
9.模擬手機鍵盤發短信
題目連接:http://acm.nyist.cf/problem/1350
#include<stdio.h> #include<string.h> int main(){ char one[5]={'?','\'',',','.','!'}; char two[6]={'C','a','b','c','A','B'}; char three[6]={'F','d','e','f','D','E'}; char four[6]={'I','g','h','i','G','H'}; char five[6]={'L','j','k','l','J','K'}; char six[6]={'O','m','n','o','M','N'}; char seven[8]={'S','p','q','r','s','P','Q','R'}; char eight[6]={'V','t','u','v','T','U'}; char nine[8]={'Z','w','x','y','z','W','X','Y'}; char c[10001]; while(~scanf("%s",c)){ int len=strlen(c); int sum=1; int i; for(i=0;i<len;i++){ int sum=1; if(c[i]=='1'){ for(int j=i;j<len;j++){ if(c[j]==c[j+1]){ sum++; i=j; }else{ i=j; break; } } printf("%c",one[sum%5]); } if(c[i]=='2'){ for(int j=i;j<len;j++){ if(c[j]==c[j+1]){ sum++; i=j; }else{ i=j; break; } } printf("%c",two[sum%6]); } if(c[i]=='3'){ for(int j=i;j<len;j++){ if(c[j]==c[j+1]){ sum++; i=j; }else{ i=j; break; } } printf("%c",three[sum%6]); } if(c[i]=='4'){ for(int j=i;j<len;j++){ if(c[j]==c[j+1]){ sum++; i=j; }else{ i=j; break; } } printf("%c",four[sum%6]); } if(c[i]=='5'){ for(int j=i;j<len;j++){ if(c[j]==c[j+1]){ sum++; i=j; }else{ i=j; break; } } printf("%c",five[sum%6]); } if(c[i]=='6'){ for(int j=i;j<len;j++){ if(c[j]==c[j+1]){ sum++; i=j; }else{ i=j; break; } } printf("%c",six[sum%6]); } if(c[i]=='7'){ for(int j=i;j<len;j++){ if(c[j]==c[j+1]){ sum++; i=j; }else{ i=j; break; } } printf("%c",seven[sum%8]); } if(c[i]=='8'){ for(int j=i;j<len;j++){ if(c[j]==c[j+1]){ sum++; i=j; }else{ i=j; break; } } printf("%c",eight[sum%6]); } if(c[i]=='9'){ for(int j=i;j<len;j++){ if(c[j]==c[j+1]){ sum++; i=j; }else{ i=j; break; } } printf("%c",nine[sum%8]); } if(c[i]=='0'){ for(int j=i;j<len;j++){ if(c[j]==c[j+1]){ sum++; i=j; }else{ i=j; break; } } for(int k=0;k<sum-1;k++){ printf(" "); } } } printf("\n"); } return 0; }
10.下任市長(簡單模擬)
題目連接:http://acm.nyist.cf/problem/1362
這道題難度不高,主要在於翻譯是否準確,可否瞭解題意。
須要注意的還有數組循環的處理
題目大意:多組測試樣例,輸入兩個數字n和p(n表明候選人數,包括本屆市長,p表明鵝卵石的個數),一張圓桌,候選人以逆時針的方向圍坐,桌上有一隻碗,碗裏面有p個鵝卵石,本屆市長的位置爲0,其後爲1,2,3......n-1,從0位置開始每人從碗裏拿一個石子(若是碗裏有石子的狀況下),若是碗裏沒有石子了,而其餘人手中仍有石子,你須要將你手中的石子所有放入碗中(若是你有的話),直到全部的石子所有到一我的手中,那我的就是下屆市長,輸出他的編號,結束。
#include<stdio.h> #include<string.h> int main(){ int n,p; int cand[60]; while(~scanf("%d%d",&n,&p)){ if(n==0&&p==0) break; memset(cand,0,sizeof(cand));//初始化,每一個人手中都沒有石子 int bowl=p; for(int i=0;i<n;i++){ if(bowl>0){ bowl--; cand[i]++; // printf("cand[%d]:%d bowl:%d\n",i,cand[i],bowl); }else{ if(cand[i]==p){ // printf("what is wrone?\n"); printf("%d\n",i); break; } else{ bowl=cand[i]; cand[i]=0; } } if(i==n-1) i=-1;//循環 } } return 0; }
11.計劃日(經典日期問題)
題目連接:http://acm.nyist.cf/problem/1363
日期問題我以爲剛開始我是比較懼怕作這樣的題的,估計之後多練就行了。
#include<cstdio>//提交用c++,用c會報編譯錯誤,我懷疑是bool函數的緣由 int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};//平閏年每個月天數 bool isLeap(int year){ return ((year%4==0&&year%100!=0)||(year%400==0)); } int main(){ int t; scanf("%d",&t); while(t--){ int time,y,m,d; int time2; int w,n; scanf("%d%d%d",&time,&w,&n); y=time/10000; m=(time%10000)/100; d=time%100; while(n>0){ d++; if(d==month[m][isLeap(y)]+1){ m++; d=1; } if(m==13){ y++; m=1; } w++; if(w==8){ w=1; } n--; } time2=d+m*100+y*10000; //printf("%d%d%d %d",y,m,d,w);剛開始是以這種方式輸出,程序老是出錯。因此改成下面這種輸出方式。 printf("%d %d\n",time2,w); } return 0; }
12.閃電大小(圖形問題)
題目連接:http://acm.nyist.cf/problem/1384
圖形問題是我之前比較討厭的一種題,剛開始三角形都不會輸出,主要是之前思路沒有打開
這題解題思路是將閃電分爲三個部分使用for循環輸出
#include<stdio.h> int main(){ int t; scanf("%d",&t); while(t--){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ for(int j=0;j<n-i;j++){ printf(" "); } printf("*"); printf("\n"); } for(int i=0;i<n+1;i++){ printf("*"); } printf("\n"); for(int i=0;i<n;i++){ for(int j=0;j<n-i-1;j++){ printf(" "); } printf("*"); printf("\n"); } printf("\n"); } }
13.再見手機鍵盤問題
這題超級簡單
#include<stdio.h> #include<string.h> int main(){ int n; char c[1001]; scanf("%d",&n); while(n--){ scanf("%s",c); int len=strlen(c); for(int i=0;i<len;i++){ if(c[i]>='a'&&c[i]<='c') printf("2"); if(c[i]>='d'&&c[i]<='f') printf("3"); if(c[i]>='g'&&c[i]<='i') printf("4"); if(c[i]>='j'&&c[i]<='l') printf("5"); if(c[i]>='m'&&c[i]<='o') printf("6"); if(c[i]>='p'&&c[i]<='s') printf("7"); if(c[i]>='t'&&c[i]<='v') printf("8"); if(c[i]>='w'&&c[i]<='z') printf("9"); } printf("\n"); } }
14.3n+1猜測(簡單模擬)
題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805325918486528
#include<stdio.h> int main(){ int n; scanf("%d",&n); int step=0; while(n!=1){ if(n%2==0){ n=n/2; }else{ n=(3*n+1)/2; } step++; } printf("%d\n",step); }
15.挖掘機技術哪家強
題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805289432236032
#include<cstdio> const int maxn = 100010; int school[maxn] = {0}; int main(){ int n,id,score; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%d",&id,&score); school[id]+=score; } int k=1,MAX=-1; for(int i=1;i<=n;i++){//這裏必定要注意,id是有可能等於n的 if(school[i]>MAX){ MAX=school[i]; k=i; } } printf("%d %d\n",k,MAX); return 0; }
16.跟奧巴馬一塊兒學編程
題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805285812551680
#include<stdio.h> int main(){ int n; char c; int h; scanf("%d",&n); getchar(); scanf("%c",&c); if(n%2==0){ h=n/2; }else{ h=n/2+1; }//四捨五入 for(int i=0;i<n;i++){ printf("%c",c); } printf("\n"); for(int i=0;i<h-2;i++){ printf("%c",c); for(int j=0;j<n-2;j++){ printf(" "); } printf("%c\n",c); } for(int i=0;i<n;i++){ printf("%c",c); } return 0; }
17.計算日期差值
codeup網站最近故障,因此題目連接和截圖就沒了,我簡單描述一下本題的意思:
有多組測試數據,分別爲兩個日期,格式爲YYYYMMDD,計算兩個日期相差的天數
#include<cstdio> int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31}, {31,31},{30,30},{31,31},{30,30},{31,31}}; bool isLeap(int year){ return ((year%4==0)&&(year%100!=0))||(year%400)==0; } int main(){ int time1,y1,m1,d1; int time2,y2,m2,d2; while(~scanf("%d%d",&time1,&time2)){ if(time1>time2){ int temp; temp=time1; time1=time2; time2=temp; } y1=time1/10000,m1=time1%10000/100,d1=time1%100; y2=time2/10000,m2=time2%10000/100,d2=time2%100; int count=1; while(y1!=y2||m1!=m2||d1!=d2){ d1++; if(d1==month[m1][isLeap(y1)]+1){ m1++; d1=1; } if(m1==13){ y1++; m1=1; } count++; } printf("%d\n",count); } return 0; }
18.換個格式輸出整數
題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805318855278592
#include<stdio.h> #include<string.h> int main(){ int n; scanf("%d",&n); if(n>=0&&n<=9){ for(int i=1;i<=n;i++){ printf("%d",i); } printf("\n"); } if(n>=10&&n<=99){ for(int i=1;i<=n/10;i++){ printf("S"); } for(int i=1;i<=n%10;i++){ printf("%d",i); } printf("\n"); } if(n>=100&&n<=999){ for(int i=1;i<=n/100;i++){ printf("B"); } for(int i=1;i<=n%100/10;i++){ printf("S"); } for(int i=1;i<=n%10;i++){ printf("%d",i); } printf("\n"); } return 0; }
19.進制轉換
我討厭進制轉換!我討厭進制轉換!我討厭進制轉換!
今天晚上就搞這一道題了,作完收工,哈哈。進制轉換是我不喜歡的一道題,跟計算機相關的考試好像不少都會牽涉到這個問題,誰讓計算機是01組成的呢。
對一個 P 進制的數,若是想要轉換爲 Q 進制,須要分兩步:
① 將 P 進制數 X 轉換爲 十進制 數 y。
#include<stdio.h> int main(){ int P;//P進制 int x;//P進制數 x int y=0;//P進制數 x 轉換爲 十進制數 y int product=1;//product在循環中會不斷乘P,獲得1,P,P^2,P^3...... scanf("%d%d",&P,&x); while(x!=0){ y=y+(x%10)*product; x=x/10; product=product*P; } printf("%d\n",y); return 0; }
②將 十進制數 y 轉換爲 Q 進制數 z。
#include<stdio.h> int main(){ int y;//十進制的y int Q;//Q進制 int z[40];//數組z存放Q進制數y的每一位 int num=0;//num爲位數 scanf("%d%d",&y,&Q); do{ z[num++]=y%Q; y=y/Q; } while(y!=0); for(int i=num-1;i>=0;i--){ printf("%d",z[i]); } return 0; }
例題:D進制的A+B
題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805299301433344
#include<stdio.h> int main(){ int A,B,y; int D; int z[40]; int num=0; scanf("%d%d%d",&A,&B,&D); y=A+B;//十進制數y do{ z[num++]=y%D; y=y/D; } while(y!=0); for(int i=num-1;i>=0;i--){ printf("%d",z[i]); } return 0; }
20.判斷迴文字符串
#include<stdio.h> #include<string.h> int main(){ char str[1000]; scanf("%s",str); int len=strlen(str); int i=0; int j=len-1; while(i<=j){ if(str[i]==str[j]){ i++; j--; } else{ printf("NO\n"); break; } } if(i>j){ printf("YES\n"); } return 0; }
21.說反話(二維字符數組的應用)
題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805314941992960
單點測試:(while不會自動結束,須要按ctrl+Z)
#include<stdio.h> #include<string.h> char str[90][90]; int main(){ int ans=0; while(~scanf("%s",str[ans])){ ans++; } for(int i=ans-1;i>=0;i--){ printf("%s",str[i]); if(i>0) printf(" "); } return 0; }
多點測試:
#include<stdio.h> #include<string.h> int main(){ char str[90]; gets(str); int len=strlen(str); int r=0,h=0;//行和列 char ans[90][90]; for(int i=0;i<len;i++){ if(str[i]!=' '){ ans[r][h++]=str[i];//單詞存儲中...... }else{ ans[r][h]='\0';//一個單詞存儲完畢 r++;//開始存儲下一個; h=0; } } for(int i=r;i>=0;i--){ printf("%s",ans[i]); if(i>0) printf(" "); } return 0; }
22.我要經過(PATB1003)
題目連接:https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192
額~題目至關晦澀難懂,我簡單描述一下吧
1.字符串中只能包含‘P’,‘A’,‘T’這三種字符
2.只能有一個‘P’和一個‘T’,P必定在T以前,且P和T之間必定有A
3.P以前的A的個數 * P和T之間A的個數 = T以後A的個數
同時知足以上三個條件,輸出YES,不然輸出NO
思路參考:https://blog.csdn.net/whl_program/article/details/76652890
#include<stdio.h> #include<string.h> int main(){ int t; scanf("%d",&t); while(t--){ char s[110]; scanf("%s",s); int len=strlen(s); int num_a=0; int p,t; for(int i=0;i<len;i++){ if(s[i]=='A') num_a++; if(s[i]=='P') p=i; if(s[i]=='T') t=i; } int flag=1; if(num_a!=len-2) flag=-1; if(p>t||t==p+1) flag=-1; if((p*(t-p-1)) != (len-1-t)) flag=-1; if(flag==1){ printf("YES\n"); }else{ printf("NO\n"); } } return 0; }
23.字符串拼接去重(PAT B1093)
解題思路:
1.字符串拼接
2.用一個int數組記錄字母是否輸出過,達到去重效果
字符串拼接方法(上一篇-語言篇中有介紹):
#include<stdio.h> #include<string.h> char stra[3000000]; char strb[1000010]; int c[1000]; int main(){ for(int i=0;i<500;i++){ c[i]=0; } gets(stra); gets(strb); strcat(stra,strb); int len=strlen(stra); for(int i=0;i<len;i++){ int k=stra[i]; if(c[k]==0){ putchar(stra[i]); c[k]=1; } } printf("\n"); return 0; }
從此有合適的題目我還會持續更新本帖,歡迎你們學習交流。