入门篇(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; }
从此有合适的题目我还会持续更新本帖,欢迎你们学习交流。