Loading... ## 1. A+B Problem ``` 题目描述 输入两个整数a,b,输出它们的和. 题目保证输入数据的范围如下: -1000000000<=a<=1000000000 -1000000000<=b<=1000000000 ``` ``` 输入输出格式 输入格式 输入两个整数,以空格分开 输出格式 输出一个整数 ``` ``` 输入输出样例 输入样例#1: 20 30 输出样例#1: 50 输入样例#2: 6 9 输出样例#2: 15 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<iostream> using namespace std; int a,b; int main(){ cin>>a>>b; cout<<a + b; return 0; } ``` ## 2. 删除最大和最小 ``` 题目描述 请写一个程序,输入n个不同的整数,删除最大数字和最小数字,依次输出剩余n-2个整数。 ``` ``` 输入输出格式 输入格式 输入共两行:第一行为正整数n,第二行为n个整数。 其中n<=100,数字绝对值不超过100000。 输出格式 一行共n-2个整数 ``` ``` 输入输出样例 输入样例#1: 5 10 8 5 2 6 输出样例#1: 8 5 6 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ int n, num[100], maxium=0, minium; cin>>n; for(int i=0;i<n;i++)cin>>num[i]; minium=num[0]; for(int i=0;i<n;i++){ if(num[i]<minium)minium=num[i]; if(num[i]>maxium)maxium=num[i]; } for(int i=0;i<n;i++) if((num[i]!=maxium)&&(num[i]!=minium)) cout<<num[i]<<" "; return 0; } ``` ## 3. lester大帅哥 ``` 题目描述 (传说级别的题目不一定都是超级难题,也包括具有某些特殊含义题目。比如这道题就是为了纪念这个网站的缔造者,传说中的lester大神) 知道这个网站谁做的吗,就是史上最帅小鲜肉lester大大! ``` ``` 输入输出格式 输入格式 没有输入 输出格式 输出lester大帅哥 ``` ``` 输入输出样例 输入样例#1: 没有输入 输出样例#1: lester大帅哥 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ cout<<"lester大帅哥"; return 0; } ``` ## 4. 三连击 ``` 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数 ``` ``` 输入输出格式 输入格式 木有输入 输出格式 若干行,每行3个数字。按照每行第一个数字升序排列 ``` ``` 输入输出样例 输入样例#1: 输出样例#1: 192 384 576 * * * ... * * * (输出被和谐了) 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ cout<<"192 384 576"<<endl; cout<<"219 438 657"<<endl; cout<<"273 546 819"<<endl; cout<<"327 654 981"<<endl; return 0; } ``` ## 5. 凑和 ``` 题目描述 有n个整数,编号1到n,判断能否找到两个不同编号的数总和为m。 如果可以找到,则输出Yes。若找不到则输出No。 注意:需要找的是两个不同编号的数。 输入输出格式 输入格式 输入的第一行为n和m两个整数,第二行为n个数字。 其中n<=100,数字绝对值不超过100000。 输出格式 Yes或者No ``` ``` 输入输出样例 输入样例#1: 4 15 1 5 3 10 输出样例#1: Yes 输入样例#2: 3 5 1 2 5 输出样例#2: No 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int m,n,num[101],i,j; bool ans=0; int main(){ cin>>n>>m; for(i=0;i<n;i++)cin>>num[i]; for(i=0;i<n;i++){ for(j=i+1;j<n;j++) if(num[i]+num[j]==m){ans=1;break;} } cout<<(ans?"Yes":"No")<<endl; return 0; } ``` ## 6. 病毒扩散(BestAC by燕子何) ``` 题目描述 今天在地图上已经有几个地点爆发了疫情,请找到第二天会有哪些地方受到威胁。输入是5*5的表格,用来表示地图上的疫情。E表示现在没有疫情,A表示已经有疫情。第二天,所有已有疫情地点的上下左右位置都会发展出疫情。请输出5*5的新表格,用来表示第二天的疫情。 ``` ``` 输入输出格式 输入格式 5*5的字符阵 输出格式 5*5的字符阵 输入输出样例 输入样例#1: EEEEE EEEEE AEEEE EEEAE EEEEE 输出样例#1: EEEEE AEEEE AAEAE AEAAA EEEAE 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<iostream> using namespace std; char a[7][7]; int main(){ for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) cin>>a[i][j]; for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) if(a[i][j]=='A'){ if(i-1>=1&&a[i-1][j]!='A') a[i-1][j]='a'; if(i+1<=5&&a[i+1][j]!='A') a[i+1][j]='a'; if(j-1>=1&&a[i][j-1]!='A') a[i][j-1]='a'; if(j+1<=5&&a[i][j+1]!='A') a[i][j+1]='a'; } for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) if(a[i][j]=='a') a[i][j]='A'; cout<<endl; for(int i=1;i<=5;i++){ for(int j=1;j<=5;j++) cout<<a[i][j]; cout<<endl; } return 0; } ``` ## 7. 大小写转换 ``` 题目描述 将字符串中的大写字母转为小写,小写字母转为大写 ``` ``` 输入输出格式 输入格式 一行字符串,只包含字母,无需检查输入合法性 输出格式 一行字符串 ``` ``` 输入输出样例 输入样例#1: abcdEFG 输出样例#1: ABCDefg 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; char c; int main(){ while(cin>>c){ if(c>='A'&&c<='Z')cout<<char(c+32); if(c>='a'&&c<='z')cout<<char(c-32); } return 0; } ``` ## 8. 三数凑和 ``` 题目描述 请写一个程序,在输入的n个正整数中,判断能否找到三个数总和为m,这三个数可以重复(即n个数中的每个数都可以使用多次)。如果可以找到,则输出为Yes。若找不到则输出No。输入的第一行为n和m两个整数,第二行为n个数字。 其中n<=1000,数字绝对值不超过2000。 ``` ``` 输入输出格式 输入格式 第一行为n和m两个整数,第二行为n个数字。 其中n<=1000,数字绝对值不超过2000。m<=2000。 输出格式 Yes或者No ``` ``` 输入输出样例 输入样例#1: 4 15 1 5 3 9 输出样例#1: Yes 输入样例#2: 3 10 5 6 7 输出样例#2: No 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int a[1000],b[2001],n,m; bool cnt=0; int main(){ cin>>n>>m; for(int i=0;i<n;i++)cin>>a[i],b[a[i]]=1; for(int j=0;j<n;j++) for(int k=0;k<n;k++){ if(m-a[j]-a[k]>2000||m-a[j]-a[k]<0) continue; if(b[m-a[j]-a[k]]==1){cnt=1;break;} } cout<<(cnt?"Yes":"No")<<endl; return 0; } ``` ## 9. 一个菱形2 ``` 题目描述 请写一个程序,使用输出命令在平面上输出一个菱形,具体形状请参考下文中的输出样例。 注意: 一共7行,每一行都有一个换行,行之间不能有多余空行; 行末星号后不应该出现多余空格; 星号之间不应该有空格。 输入输出格式 输入格式 无 输出格式 无 输入输出样例 输入样例#1: 无 输出样例#1: * *** ***** ******* ***** *** * 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<iostream> using namespace std; int main(){ cout<<" *"<<endl; cout<<" ***"<<endl; cout<<" *****"<<endl; cout<<"*******"<<endl; cout<<" *****"<<endl; cout<<" ***"<<endl; cout<<" *"<<endl; return 0; } ``` ## 10. ASCII码破密 ``` 题目描述 请把以下密码通过ASCII码转换成英文句子,并写一个程序把该句子完整 地输出到屏幕 67 43 43 32 114 117 110 115 32 102 97 115 116 ``` ``` 输入输出格式 输入格式 无 输出格式 一行字符串 ``` ``` 输入输出样例 输入样例#1: 无输入 输出样例#1: 保密 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<iostream> using namespace std; int main(){ cout<<"C++ runs fast"; return 0; } ``` ## 11. A+B ``` 题目描述 请写一个程序,输入是两个整数a和b,用空格分开,输出是这两个数的和。 ``` ``` 输入输出格式 输入格式 一行里有两个整数,用空格分开 输出格式 一个整数 ``` ``` 输入输出样例 输入样例#1: 7 8 输出样例#1: 15 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ int a,b; cin>>a>>b; cout<<a+b<<endl; return 0; } ``` ## 12. 长方体体积 ``` 题目描述 请写一个程序,输入长方体的长,宽,高。输出这 个长方体的体积(保留2位小数)。 ``` ``` 输入输出格式 输入格式 输入包含三个浮点型数字,用空格分开,输入的数 字都不会超过10000。 输出格式 输出一个浮点数。 ``` ``` 输入输出样例 输入样例#1: 2.5 5 1 输出样例#1: 12.50 输入样例#2: 1 2 3 输出样例#2: 6.00 输入样例#3: 2.5 2 2 输出样例#3: 10.00 ``` ``` #include<iostream> #include<iomanip> using namespace std; double a,b,c; int main(){ cin>>a>>b>>c; cout<<fixed<<setprecision(2)<<a * b * c; return 0; } ``` ## 13. 凯撒加密字符 ``` 题目描述 历史上罗马的凯撒大帝使用过一种加密技术,把英 文的每个字母按照规律变成另一个字母。例如以下 规则:a加密后变成b,b加密后变成c,c加密后变成d,…,y加密后变成z,z加密后变成a 请写一个程序,输入是三个小写字母,输出是这些字母加密后的 结果。 ``` ``` 输入输出格式 输入格式 输入文件ceasar.in 输入共一行,三个小写字母,用空格分开 输出格式 输出文件ceasar.out 输出共一行,三个小写字母 ,用空格分开 ``` ``` 输入输出样例 输入样例#1: x y z 输出样例#1: y z a 输入样例#2: a b c 输出样例#2: b c d 输入样例#3: 输出样例#3: ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ freopen("ceasar.in", "r", stdin); freopen("ceasar.out", "w", stdout); char a, b, c; cin>>a>>b>>c; a = (a - 'a' + 1) % 26 + 'a'; b = (b - 'a' + 1) % 26 + 'a'; c = (c - 'a' + 1) % 26 + 'a'; cout<<a<<" "<<b<<" "<<c<<endl; return 0; } ``` ## 14. 打折 ``` 题目描述 西佳佳商场进行暑期打折促销,一支钢笔单价10元 。如果购买数量满100支可以打七折;如果购买数量满50支可以打八折。请写一个程序,输入是一个正 整数表示购买数量,输出总费用。 ``` ``` 输入输出格式 输入格式 输入一个整数,保证不超过100000 输出格式 输出一个整数 ``` ``` 输入输出样例 输入样例#1: 80 输出样例#1: 640 解释说明:买80支笔可以打八折,每支笔单价变成8元,总费用=8元/支*80支=640元 输入样例#2: 1 输出样例#2: 10 解释说明:买1支笔不打折,总费用=10元/支*1支=10元 输入样例#3: 100 输出样例#3: 700 解释说明:买100支笔可以打七折,每支笔单价7元 ,总费用=7元/支*100支=700元 ``` ``` #include<iostream> using namespace std; int main(){ int n; cin>>n; if(n<50) cout<<n*10<<endl; else if(n>=50&&n<100) cout<<n*10*0.8<<endl; else cout<<n*10*0.7<<endl; return 0; } ``` ## 15. 含k个3的数 ``` 题目描述 输入两个正整数m和k,其中1<m<1000000000,1<=k<=8 ,判断m能否被19 整除,且恰好含有k个3,如果满足条件,则输出YES,否则,输出NO。 ``` ``` 输入输出格式 输入格式 m 和 k 的值,中间用单个空格间隔 输出格式 满足条件时输出 YES,不满足时输出 NO ``` ``` 输入输出样例 输入样例#1: 43833 3 输出样例#1: YES 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ int x,y,cnt=0; cin>>x>>y; int z=x; while(z>=1){ if(z%10==3) cnt++; z=z/10; } if(cnt==y && x%19==0) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; } ``` ## 16. 最大值 ``` 题目描述 写一个程序,输入是三个整数,输出是这三个数中 的最大值。注意: 三个数中可能出现相等的数字 ``` ``` 输入输出格式 输入格式 共一行,三个整数,由空格分开,绝对值均不超过1000000000 输出格式 一个整数 ``` ``` 输入输出样例 输入样例#1: 1 1 0 输出样例#1: 1 输入样例#2: 1 2 3 输出样例#2: 3 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<iostream> using namespace std; int main(){ int a,b,c; cin>>a>>b>>c; if(a>=b&&a>=c) cout<<a<<endl; else if(b>=a&&b>=c) cout<<b<<endl; else cout<<c<<endl; return 0; } ``` ## 17. 含k个3的数 ``` 题目描述 输入两个正整数m和k,其中1<m<1000000000,1<=k<=8 ,判断m能否被19 整除,且恰好含有k个3,如果满足条件,则输出YES,否则,输出NO。 ``` ``` 输入输出格式 输入格式 m 和 k 的值,中间用单个空格间隔。 输出格式 满足条件时输出 YES,不满足时输出 NO。 ``` ``` 输入输出样例 输入样例#1: 43833 3 输出样例#1: YES 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ int x,y,cnt=0; cin>>x>>y; int z=x; while(z>=1){ if(z%10==3) cnt++; z=z/10; } if(cnt==y && x%19==0) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; } ``` ## 18. 三角形判定 ``` 题目描述 数学家告诉我们:三角形中,任意两条边之和一定 大于第三边。请写一个程序,输入为三条线段的长 度,输出Yes或者No代表这三条线段能否组成一个三角形。 提示: 输入三条边长a,b,c 如果(a加b大于c 并且 b加c大于a 并且 c加a大于b)就输出Yes 否则输出No ``` ``` 输入输出格式 输入格式 输入共一行,三个整数,代表三条线段的长度,均 不超过100000 输出格式 一行字符串,Yes或者No ``` ``` 输入输出样例 输入样例#1: 9 5 4 输出样例#1: No 输入样例#2: 4 5 6 输出样例#2: Yes 输入样例#3: 输出样例#3: ``` ``` #include<iostream> using namespace std; int main(){ int a,b,c; cin>>a>>b>>c; if(a>=b&&a>=c) cout<<a<<endl; else if(b>=a&&b>=c) cout<<b<<endl; else cout<<c<<endl; return 0; } ``` ## 19. 谁考了第k名 ``` 题目描述 在一次考试,每个学生的成绩均不相同,现在知道学生的学号和成绩,求考第k名学生的学号和成绩。 ``` ``` 输入输出格式 输入格式 第一行两个整数n, k,分别表示学生人数和要求的第k名学生,1<=n<=100, 1<=k<=n。 其后有n行,每行一个字符串和一个浮点数,分别表示学号和成绩。 输出格式 第k名学生的学号和成绩 ``` ``` 输入输出样例 输入样例#1: 2 1 001 90 002 80 输出样例#1: 001 90 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; struct stu{string id;double mark;}; stu a[103]; int n,k; bool cmp(const stu&a,const stu&b){return a.mark>b.mark;} int main(){ cin>>n>>k; for(int i=1; i<=n; i++) cin>>a[i].id>>a[i].mark; sort(a+1,a+1+n,cmp); cout<<a[k].id<<" "<<a[k].mark<<endl; return 0; } ``` ## 20. 菱形变形 ``` 题目描述 请写一个程序,输入是一个正整数n,输出一个边长为n的菱形图形。 ``` ``` 输入输出格式 输入格式 一个正整数n, n<=1000 输出格式 2n-1行字符串。注意行末不能出现多余空格 ``` ``` 输入输出样例 输入样例#1: 4 输出样例#1: * *** ***** ******* ***** *** * 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<iostream> using namespace std; int main(){ int n; cin>>n; for (int i=0; i<n; i++){ for (int j=0; j<(n-1-i); j++) cout<<" "; for (int j=0; j<2*i+1; j++) cout<<"*" ; cout<<endl; } for (int i=0; i<n-1; i++){ for (int j=0; j<i+1; j++) cout<<" "; for (int j=0; j<2*(n-1)-(1+2*i); j++) cout<<"*"; cout<<endl; } return 0; } ``` ## 21. FizzBuzz ``` 题目描述 ## FizzBuzz游戏需要玩家报数时替换特定数字。请写 一个程序,输入是一个正整数n, n<=100. 依次对1至n的整数打印,如该数能被3整除的时候打印Fizz ;能被5整除的时候打印Buzz;如果既能被3又能被5整除的时候打印FizzBuzz;否则打印该数字。两次 打印间有空格分开。 ``` ``` 输入输出格式 输入格式 一个正整数n 输出格式 一行字符串 ``` ``` 输入输出样例 输入样例#1: 16 输出样例#1: 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 输入样例#2: 5 输出样例#2: 1 2 Fizz 4 Buzz 输入样例#3: 1 输出样例#3: 1 ``` ``` #include<iostream> using namespace std; int main(){ int n,i; cin>>n; for(i=1;i<=n;i++){ if(i % 5 == 0 && i % 3 == 0){ cout<<"FizzBuzz "; } else if(i % 5 == 0){ cout<<"Buzz "; } else if(i % 3 == 0){ cout<<"Fizz "; } else{ cout<<i<<" "; } } return 0; } ``` ## 22. 质数生成 ``` 题目描述 请写一个程序,输入是一个正整数n,输出1到n内所有质数,用空格分隔 开。 ``` ``` 输入输出格式 输入格式 一个正整数n, n<=100000 输出格式 一行正整数,用空格分隔开 ``` ``` 输入输出样例 输入样例#1: 20 输出样例#1: 2 3 5 7 11 13 17 19 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; bool isPrime(int x){ if(x<=1)return 0; for(int i=2;i*i<=x;i++) if(x%i==0)return 0; return 1; } int main(){ int n; cin>>n; for(int p=2;p<=n;p++) if(isPrime(p))cout<<p<<" "; return 0; } ``` ## 23. 括号匹配 ``` 题目描述 假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成。编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则 返回“YES”;否则返回“NO”。 ``` ``` 输入输出格式 输入格式 一行字符串即表达式 输出格式 一行,匹配时输出YES,否则输出NO ``` ``` #include<iostream> #include<string> using namespace std; int top=0; string f; int main(){ getline(cin,f); bool match=1; for(int i=0;i<f.size();i++){ if(f[i]=='(') ++top; else if(f[i]==')'){ if (top==0){ match=0; break; } top--; } } if (top>0)match=0; if (match) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; } ``` ## 26. 扫雷游戏 ``` 题目描述 扫雷游戏是一款十分经典的单机小游戏。在n行m列 的雷区中有一些格子含有地雷(称之为地雷格), 其他格子不含地雷(称之为非地雷格)。玩家翻开 一个非地雷格时,该格将会出现一个数字——提示周 围格子中有多少个是地雷格。游戏的目标是在不翻 出任何地雷格的条件下,找出所有的非地雷格。 现在给出n行m列的雷区中的地雷分布,要求计算出每 个非地雷格周围的地雷格数。 1≤n≤100, 1≤m≤100 。 ``` ``` 输入输出格式 输入格式 输入文件第一行是用一个空格隔开的两个整数n和m ,分别表示雷区的行数和列数。 接下来n行,每行m个字符,描述了雷区中的地雷分 布情况。字符’*’表示相应格子是地雷格,字符’?’ 表示相应格子是非地雷格。相邻字符之间无分隔符 。 输出格式 输出文件包含n行,每行m个字符,描述整个雷区。 用’*’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符 ``` ``` #include<iostream> using namespace std; const int N=109; int n,m; char a[N][N],b[N][N]; int dx[8]={1,1,1,0,0,-1,-1,-1}; int dy[8]={1,0,-1,1,-1,1,0,-1}; int count(int x,int y){ int cnt=0; for(int k=0;k<8;k++){ int nx=x+dx[k],ny=y+dy[k]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m) cnt+=(a[nx][ny]=='*'); } return cnt; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]=='?') b[i][j]='0'+count(i,j); else b[i][j]=a[i][j]; for(int i=1;i<=n;i++,cout<<endl) for(int j=1;j<=m;j++)cout<<b[i][j]; return 0; } ``` ## 104. 大小写转换 ``` 题目描述 请用户键入一个字符串,将其中的大写字母变成小写,小写字母变成大写,输出改变后的字符串。 ``` ``` 输入输出格式 输入格式 输入文件letters.in 输入一行字符串。 输出格式 输出文件letters.out 输出一行字符串。 ``` ``` 输入输出样例 输入样例#1: Tom studied in MIT. 输出样例#1: tOM STUDIED IN mit. 输入样例#2: 输出样例#2: 输入样例#3: 输出样例#3: ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ freopen("letters.in", "r", stdin); freopen("letters.out", "w", stdout); string s, ans; getline(cin, s); for(int i=0;i<s.size();i++){ if((s[i]<='z')&&(s[i]>='a')) ans += char(s[i] - 32); else if((s[i]<='Z')&&(s[i]>='A')) ans += char(s[i] + 32); else ans += s[i]; } cout<<ans; return 0; } ``` ## 117. 卡特兰数 ``` 题目描述 卡特兰数,英文名Catalan number,是组合数学中 一个常出现在各种计数问题中出现的数列。以比利 时数学家卡塔兰 (1814–1894)的名字来命名,其前 几项为 : 1, 1, 2, 5, 14, 42, 132, … 卡特兰数 第零项h(0)=1,第一项h(1)=1,之后每项存在规律 。当k>=2时,Catalan数满足几种常见的推导方式: 方法1: h(k)= h(0)*h(k-1)+h(1)*h(k-2) + ... + h(k-1)*h(0) 方法2: h(k)=h(k-1)*2*(2*k-1)/(k+1) 请写一个程序,输入是一个正整数,输出是第n项的卡特兰数。 ``` ``` 输入输出格式 输入格式 输入是一个正整数 输出格式 输出是第n项的卡特兰数。 ``` ``` #include<bits/stdc++.h> using namespace std; typedef long long ll; ll h(int k){ if(k<2)return 1; else return h(k-1)*2*(2*k-1)/(k+1); } int main(){ int x; cin>>x; cout<<h(x)<<endl; return 0; } ``` ## 118. 最小公倍数 ``` 题目描述 请写一个程序,输入是两个正整数,输出是他们的 最小公倍数。 说明:最小公倍数英文叫做Least Common Multiple,简写LCM。 ``` ``` 输入输出格式 输入格式 两个正整数,均不超过1000000000 输出格式 一个正整数 ``` ``` 输入输出样例 输入样例#1: 4 6 输出样例#1: 12 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ long long a, b, r, result, ta, tb; cin>>a>>b; ta = a; tb = b; while(r=a%b){ a = b; b = r; } result = b * (ta / b) * (tb / b); cout<<result<<endl; return 0; } ``` ## 130. 大写 ``` 题目描述 请写一个程序,输入是一个字符串,请将其中的小 写字母都改成大写字母,并输出。 ``` ``` 输入输出格式 输入格式 输入文件capitalization.in 输入一行包含一个字符串,没有空格,长度不超过10000. 输出格式 输出文件capitalization.out 输出一个字符串 ``` ``` 输入输出样例 输入样例#1: Algorithm 输出样例#1: ALGORITHM 输入样例#2: 输出样例#2: 输入样例#3: 输出样例#3: ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ freopen("capitalization.in", "r", stdin); freopen("capitalization.out", "w", stdout); string s; getline(cin, s); for(int i = 0; i < s.size(); i++){ if(s[i] >= 'a' && s[i] <= 'z') s[i] -= 32; } cout<<s<<endl; return 0; } ``` ## 131. 凯撒加密字符串 ``` 题目描述 历史上罗马的凯撒大帝使用过一种加密技术,把英 文的每个字母按照规律变成另一个字母。例如以下 规则:a加密后变成b,b加密后变成c,c加密后变成d,…,y加密后变成z,z加密后变成a 请写一个程序,输入是一行字符串,只包含小写字母和空格,输 出是这些字母加密后的结果。 说明:字符串中的空格应不做改动 ``` ``` 输入输出格式 输入格式 输入文件caesar.in 输入一行字符串,包含小写字 母或空格。 输出格式 输出文件caesar.out 输出是其中字母加密后的结果。 说明:字符串中的空格应不做改动 ``` ``` 输入输出样例 输入样例#1: zhe ti zhen jian dan 输出样例#1: aif uj aifo kjbo ebo 输入样例#2: viva la vida 输出样例#2: wjwb mb wjeb 输入样例#3: 输出样例#3: ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ freopen("caesar.in", "r", stdin); freopen("caesar.out", "w", stdout); string s; getline(cin, s); for(int i = 0; i < s.size(); i++){ if(s[i] != ' '){ if(s[i] == 'z' || s[i] == 'Z'){ if(s[i] == 'z') s[i] = 'a'; else s[i] = 'A'; } else s[i]++; } } cout<<s<<endl; return 0; } ``` ## 132. 数字反转 ``` 题目描述 给定一个整数,请将该数各个位上数字反转得到一 个新数。新数也应满足整数的常见形式,即除非给 定的原数为零,否则反转后得到的新数的最高位数 字不应为零(参见样例)。 ``` ``` 输入输出格式 输入格式 输入共1 行,一个整数 N 输出格式 共1 行,一个整数 N ``` ``` 输入输出样例 输入样例#1: -380 输出样例#1: -83 输入样例#2: 输出样例#2: 输入样例#3: 输出样例#3: ``` ``` #include<iostream> using namespace std; typedef long long ll; int main(){ ll n,ans=0; cin>>n; if(n<0){ cout<<"-"; n=-n; } do{ ans=ans*10+n%10; n/=10; }while(n); cout<<ans; return 0; } ``` ## 133. 01背包 ``` 题目描述 有n件物品,可以考虑放入容量为c的背包。第i件物品的重量为wi,价值为vi。如何选择物品放入背包令总费用不超过背包的容量且物品 的价值总和最大。 ``` ``` 输入输出格式 输入格式 第1行2个整数,背包容量c和物品的数量n。1<=n<=1000, 0<=c<=10000 下面n行,每行2个整数wi和vi,表示第i件物品的费用和价值。 0<=wi, vi<=10000 输出格式 输出一个整数,代表装入物品的最大价值。 ``` ``` 输入输出样例 输入样例#1: 10 4 2 1 3 3 4 5 7 9 输出样例#1: 12 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; const int MAXC=2009; int n,c,w,v,f[MAXC]; int main(){ cin>>c>>n; for(int i=1;i<=n;i++){ cin>>w>>v; for(int j=c;j>=w;j--) f[j]=max(f[j], f[j-w]+v); } cout<<f[c]; return 0; } ``` ## 134. 完全背包 ``` 题目描述 N件物品放入容量为C的背包。第i件物品的费用(重量、体积等)为wi,价值为vi。每件物品可以取用任意多次(无限数量),选择将哪 些物品放入背包令总费用不超过背包的容量且物品的价值总和最大。 ``` ``` 输入输出格式 输入格式 第1行2个整数C和N,分别表示背包容量和物品的数量,C<=10000, N<=100 下面n行,每行2个整数,表示第i件物品的费用和价值,1<=wi, vi<=10000 输出格式 一行,一个整数,装入物品的最大价值 ``` ``` 输入输出样例 输入样例#1: 12 4 2 1 3 3 4 5 7 9 输出样例#1: 15 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; const int MAXC=2009; int n,c,w,v,f[MAXC]; int main(){ cin>>c>>n; for(int i=1;i<=n;i++){ cin>>w>>v; for(int j=w;j<=c;j++) f[j]=max(f[j], f[j-w]+v); } cout<<f[c]; return 0; } ``` ## 137. 得奖分数线 (前m名都能获奖) ``` 题目描述 小盆友们参加编程比赛,共n人参赛,前m名一定可 以得奖。请写一个程序,输入第一行是两个正整数n和m,输入第二行是n个参赛者的得分,由空格隔开 。输出是至少得几分可以拿奖。如有并列分数时, 并列前m名都能获奖。 ``` ``` 输入输出格式 输入格式 输入第一行是两个正整数n和m,输入第二行是n个 参赛者的得分(m<=n<=10000) 输出格式 输出一个数。 ``` ``` 输入输出样例 输入样例#1: 4 2 90 90 70 100 输出样例#1: 90 输入样例#2: 输出样例#2: 输入样例#3: 输出样例#3: ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ int n,k,a[500001]; cin>>n>>k; for(int i=0;i<n;i++) cin>>a[i]; sort(a, a+n); reverse(a, a+n); cout<<a[k-1]; return 0; } ``` ## 143. ISBN号码 ``` 题目描述 每一本正式出版的图书都有一个ISBN号码与之对应 ,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔 符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位 数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代 表维京出版社;第二个分隔之后的五位数字代表该 书在出版社的编号;最后一位为识别码。识别码的 计算方法如下: 首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即 为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得 到的:对067082162这9个数字,从左至右,分别乘 以1,2,…,9,再求和,即0×1+6×2+„„+2×9=158, 然后取158 mod 11的结果4作为识别码。 你的任务 是编写程序判断输入的ISBN号码中识别码是否正确 ,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。 ``` ``` 输入输出格式 输入格式 输入文件isbn.in 输入只有一行,是一个字符序列 ,表示一本书的ISBN号码(保证输入符合ISBN号码 的格式要求)。 输出格式 输出文件isbn.out 输出共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。 ``` ``` 输入输出样例 输入样例#1: 0-670-82162-0 输出样例#1: 0-670-82162-4 输入样例#2: 输出样例#2: 输入样例#3: 输出样例#3: ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ freopen("isbn.in", "r", stdin); freopen("isbn.out", "w", stdout); string s; cin>>s; int c=1,sum=0; for(int i=0;i<s.size()-2;i++) if(i!=1&&i!=5){ sum+=c*(s[i]-'0'); c++; } int id=sum%11; char code='X'; if(id<10) code='0'+id; if(s[12]==code) cout<<"Right"; else cout<<s.substr(0,12)<<code<<endl; return 0; } ``` ## 147. 杀伤范围 ``` 题目描述 一次元僵尸大战爆发了,英雄站在一次元世界的0点,n只僵尸从英雄的前后向他袭来。英雄的魔法杀伤范围为r,当僵尸离英雄的距离小于等于r时该僵尸 会被消灭。为了消灭至少k只僵尸,请问英雄魔法需要多大? ``` ``` 输入输出格式 输入格式 输入文件range.in 输入第一行为n和k,1<=k<=n<=10000。第二行为n个整数,代表这n只僵尸的位置, 均在-100000到100000之间。 输出格式 输出文件range.out 输出为一个正整数,代表杀伤 范围r。 ``` ``` 输入输出样例 输入样例#1: 8 3 1 2 3 4 -1 -2 2 2 输出样例#1: 2 输入样例#2: 输出样例#2: 输入样例#3: 输出样例#3: ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ freopen("range.in", "r", stdin); freopen("range.out", "w", stdout); int n,k,a[100001],c=0,g=0; cin>>n>>k; for(int i = 0; i < n; i ++) cin>>a[i]; sort(a, a+n); while(g<k){ g=0; c++; for(int i=0;i<n;i++) if(abs(a[i])<=c) g++; } cout<<c; return 0; } ``` ## 148. 合影效果 ``` 题目描述 同学们去野外郊游,为美丽的景色所陶醉,想合影 留念。如果他们站成一排,男生全部在左(从拍照 者的角度),并按照从矮到高的顺序从左到右排, 女生全部在右,并按照从高到矮的顺序从左到右排 ,请问他们合影的效果是什么样的?输入第一行是 人数n,之后有n行每行是一位朋友的描述,包括性 别和身高。输出是一行表示合影的身高排列,由空 格隔开。 ``` ``` 输入输出格式 输入格式 输入文件photo.in 输入第一行是人数n,n<=100。 之后有n行每行是一位朋友的描述,包括性别和身高。 输出格式 输出文件photo.out 输出是一行表示合影的身高排 列,由空格隔开。说明:输入输出的身高都保留两 位小数 ``` ``` 输入输出样例 输入样例#1: 6 male 1.72 male 1.78 female 1.61 male 1.65 female 1.70 female 1.56 输出样例#1: 1.65 1.72 1.78 1.70 1.61 1.56 输入样例#2: 输出样例#2: 输入样例#3: 输出样例#3: ``` ``` #include<bits/stdc++.h> using namespace std; const int MAXN = 400005; string s; double h[MAXN]; int type[MAXN],rank[MAXN],n; bool cmp(int a,int b){ if(type[a] != type[b]) return type[a] < type[b]; if(!type[a]) return h[a] < h[b]; return h[a] > h[b]; } int main(){ freopen("photo.in", "r", stdin); freopen("photo.out", "w", stdout); cin>>n; for(int i = 0;i < n;i ++){ cin>>s>>h[i]; if(s[0] == 'f') type[i] = 1; else type[i] = 0; rank[i] = i; } sort(rank,rank+n,cmp); for(int i = 0;i < n;i ++) printf("%.2f%c",h[rank[i]],(i+1)==n?' ':' '); return 0; } ``` ## 150. 螺旋矩阵 ``` 题目描述 一个n*n矩阵从左上角开始顺时针填数(如图n为4),求第i行j列所填的数字 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 ``` ``` 输入输出格式 输入格式 输入文件matrix.in 包含n,i,j(i,j<=n<=100000) 输出格式 输出文件matrix.out 包含第i行j列所填的数字 ``` ``` 输入输出样例 输入样例#1: 4 2 3 输出样例#1: 14 输入样例#2: 3 2 2 输出样例#2: 9 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ freopen("matrix.in","r",stdin); freopen("matrix.out","w",stdout); ios::sync_with_stdio(false); long long n,i,j,mi,ans=0; cin>>n>>i>>j; mi=min(i,min(j,min(n-i+1,n-j+1))); if(i<=j)ans=mi*(4*(n-1)-4*mi)+10*mi-4*n-3+i+j; else ans=mi*(4*n-4*mi)+2*mi+1-i-j; cout<<ans<<endl; return 0; } ``` ## 182. Hanoi双塔 ``` 题目描述 给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆 盘是不加区分的(下图为n=3的情形)。现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求: (1)每次只能移动一个圆盘; (2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序; 任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。 hanoi双塔.bmp 输入输出格式 输入格式 输入文件 hanoi.in 一个正整数n,表示在A柱上放有2n个圆盘。 对于50%的数据,1<=n<=25 对于100%的数据,1<=n<=200 输出格式 输出文件 hanoi.out 一个正整数, 为完成上述任务所需的最少移动次数 ``` ``` 输入输出样例 输入样例#1: 2 输出样例#1: 6 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ freopen("hanoi.in","r",stdin); freopen("hanoi.out","w",stdout); int n; cin>>n; stringstream s; s.precision(0); s<<fixed<<pow(2.0L,n+1); string a=s.str(); a[a.length()-1]--; a[a.length()-1]--; cout<<a<<endl; return 0; } ``` ## 184. 逃难 ``` 题目描述 僵尸大战爆发后,爷爷需要带上值钱的财宝去逃难 ,他的每个宝物都有各自的价钱和重量。爷爷请你 帮他对所有宝物进行排序。越值钱的排在越靠前, 如果价钱一样重量越小越靠前。如果价钱和重量都 一样,那么编号越小越靠前。 ``` ``` 输入输出格式 输入格式 输入文件escape.in 输入第一行为n,之后n行每行 有三个整数,代表每件宝物的编号,价格和重量, 编号依次为1到n。n<=10000 输出格式 输出文件escape.out 输出共n行,为排序后的编号 。 ``` ``` 输入输出样例 输入样例#1: 4 1 10000 5 2 888 2 3 666666 10 4 888 1 输出样例#1: 3 1 4 2 输入样例#2: 输出样例#2: 输入样例#3: 输出样例#3: ``` ``` #include<bits/stdc++.h> using namespace std; const int N=100001; struct escape{ int id, value, weight; }; bool cmp(const escape&a, const escape&b){ if(a.value>b.value) return true; if(a.value<b.value) return false; if(a.weight<b.weight) return true; if(a.weight>b.weight) return false; if(a.id<b.id) return true; if(a.id>b.id) return false; } int main(){ freopen("escape.in", "r", stdin); freopen("escape.out", "w", stdout); int n; escape s[N]; cin>>n; for(int i=0;i<n;i++){ cin>>s[i].id; cin>>s[i].value; cin>>s[i].weight; } sort(s, s+n, cmp); for(int i=0;i<n;i++){ cout<<s[i].id<<endl; } return 0; } ``` ## 185. 英雄榜 ``` 题目描述 人们在评选世界上的超级英雄们哪个更厉害,通过 投票对英雄的攻击力,防御力,人品这三个方面进 行了打分。现在请你将投票结果进行排序:三项总 分越高排名越靠前;总分相同时,人品越高排名越 靠前;若总分和人品都相同,攻击力越高排名越高 ;若总分,人品,攻击力和防御力都相同,按照英 雄名称的字典序排列。 ``` ``` 输入输出格式 输入格式 输入第一行为n,代表有n个英雄,1<=n<=100,每项得分都是整数,范围是[0,100]。保证英雄名称都是连续的大写字母。以下每行为英雄名称,攻击力, 防御力,人品。 输出格式 输出排序结果,每行一位英雄 ``` ``` 输入输出样例 输入样例#1: 10 MONKEYKING 90 90 80 CAPTAINAMERICA 60 60 70 MAGNETO 85 30 10 ULTRAMAN 80 90 80 HIPPOPMAN 0 0 80 WOLVERINE 70 80 20 DORAEMON 50 20 100 IRONMAN 80 60 30 BATMAN 80 60 50 SUPERMAN 80 70 70 输出样例#1: MONKEYKING ULTRAMAN SUPERMAN CAPTAINAMERICA BATMAN DORAEMON IRONMAN WOLVERINE MAGNETO HIPPOPMAN 输入样例#2: 输出样例#2: 输入样例#3: 输出样例#3: ``` ``` #include<bits/stdc++.h> using namespace std; const int N=101; struct hero{ string name; int a, b, rp, sum; }; bool cmp(const hero&a, const hero&b){ if(a.sum>b.sum) return true; if(a.sum<b.sum) return false; if(a.rp>b.rp) return true; if(a.rp<b.rp) return false; if(a.a>b.a) return true; if(a.a<b.a) return false; if(a.name<b.name) return true; return false; } int main(){ int n; hero h[N]; cin>>n; for(int i=0;i<n;i++){ cin>>h[i].name; cin>>h[i].a; cin>>h[i].b; cin>>h[i].rp; h[i].sum = h[i].a+h[i].b+h[i].rp; } sort(h, h+n, cmp); for(int i=0;i<n;i++){ cout<<h[i].name<<endl; } return 0; } ``` ## 190. 最长上升子序列之简单版 ``` 题目描述 由n个整数组成的数列,记为b[1], b[2], …, b[n]。若存在i1<i2<i3< … < ie 且有b[i1]< b[i2]< … <b[ie]则称为长度为e的上升子序列。求最长上升 。求最长上升子序列(Longest increasing subsequence, LIS) ``` ``` 输入输出格式 输入格式 输入文件lis.in 输入一行整数序列,由空格隔开。说明:序列长度<=100, 每个整数绝对值<=10000。 说明:输入可以用以下代码: int n=0; while( cin>>x[n+1] ) n++ ; 输出格式 输出文件lis.out 输出一个整数。 ``` ``` 输入输出样例 输入样例#1: 2 1 1 2 3 输出样例#1: 3 输入样例#2: 1 2 3 4 5 6 5 输出样例#2: 6 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; const int N=109; int n=0,x[N],f[N]; int main(){ freopen("lis.in", "r", stdin); freopen("lis.out", "w", stdout); while(cin>>x[n+1])n++; f[0]=0; for(int i=1;i<=n;i++){ f[i]=1; for(int j=1;j<i;j++) if(x[j]<x[i]) f[i]=max(f[i],f[j]+1); } int ans=*max_element(f+1,f+1+n); cout<<ans; return 0; } ``` ## 197. 命运卡牌 ``` 题目描述 小明最近运气不好想找大师求教,大师拿出一副卡 牌,共100张牌,每张正面有一个数字分别为1到100的整数,背面写有一些人生哲理。 大师问,“小明 你的幸运数字是哪个?” 小明说,“当然是6666。” 大师心算很快,“如果要用卡牌里两个数字的乘积凑出6666,最接近的方法是68乘以98。所以这两张牌 就是你的命运卡牌,牌背后的人生哲理送给你。” 但是大师马上就要变老脑子变慢,请帮大师写一个 程序能为客人计算两张命运卡牌,输入一个数字n代表客人的幸运数字,输出两个不同数字乘法形式, 两数乘积是所有可能中最接近n的。先输出较小的数。如果有多种可能,输出两数里较小数最小的方案 。 ``` ``` 输入输出格式 输入格式 输入文件destiny.in 输入一个数字n,n<=10000 输出格式 输出文件destiny.out 输出一行字符串。 ``` ``` 输入输出样例 输入样例#1: 6666 输出样例#1: 68*98=6664 输入样例#2: 输出样例#2: 输入样例#3: 输出样例#3: ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ freopen("destiny.in", "r", stdin); freopen("destiny.out", "w", stdout); int n,x,y; cin>>n; int bst=10000; for(int i=1;i<=99;i++) for(int j=i+1;j<=100;j++){ int d=abs(i*j-n); if(d<bst){ bst=d; x=i;y=j; } } cout<<x<<"*"<<y<<"="<<x*y; return 0; } ``` ## 198. 比例简化 ``` 题目描述 在社交媒体上,经常会看到针对某一个观点同意与 否的民意调查以及结果。例如,对某一观点表示支 持的有1498 人,反对的有 902人,那么赞同与反对的比例可以简单的记为1498:902。 不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会 满意。因为这个比例的数值太大,难以一眼看出它 们的关系。对于上面这个例子,如果把比例记为5:3,虽然与真实结果有一定的误差,但依然能够较为 准确地反映调查结果,同时也显得比较直观。 现给出支持人数A,反对人数B,以及一个上限L,请你将A比B化简为A’比B’,要求在A’和B’均不大于L且A’和B’互质(两个整数的最大公约数是1)的前提下,A’/B’≥ A/B且A’/B’- A/B的值尽可能小。 (本题目为2014NOIP普及T2) ``` ``` 输入输出格式 输入格式 输入文件ratio.in 输入共一行,包含三个整数A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。 说明 1 ≤ A ≤ 1,000,000,1 ≤ B ≤ 1,000,000,1 ≤ L ≤ 100,A/B ≤ L。 输出格式 输出文件ratio.out 输出共一行,包含两个整数A’ ,B’,中间用一个空格隔开,表示化简后的比例。 ``` ``` 输入输出样例 输入样例#1: 1498 902 10 输出样例#1: 5 3 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 ``` ``` #include<bits/stdc++.h> using namespace std; int main(){ freopen("ratio.in", "r", stdin); freopen("ratio.out", "w", stdout); int L,x,y; double a,b; cin>>a>>b>>L; double ratio=a/b; double bst=L; for(int i=1;i<=L;i++) for(int j=1;j<=L;j++){ double d=i*1.0/j-ratio; if(d>=0&&d<bst){ bst=d; x=i;y=j; } } cout<<x<<" "<<y; return 0; } ``` 最后修改:2022 年 08 月 11 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 2 如果觉得我的文章对你有用,请随意赞赏