题号:1002 487-3279
题意:给定一些字符串,按一定规则转化为给定格式,统计输出多次出现的号码及其出现次数
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 int n,t,h[100010],cnt=1; 6 string s; 7 bool flag; 8 int main() { 9 cin>>n; 10 for (int i=0;i<n;i++) { 11 cin>>s; 12 for (int j=0;j<s.size();j++) { //将字符串中字母转换为对应数字字符 13 if (s[j]=='Q' || s[j]=='Z' || s[j]=='-') continue; 14 if (s[j]=='A' || s[j]=='B' || s[j]=='C') s[j]='2'; 15 if (s[j]=='D' || s[j]=='E' || s[j]=='F') s[j]='3'; 16 if (s[j]=='G' || s[j]=='H' || s[j]=='I') s[j]='4'; 17 if (s[j]=='J' || s[j]=='K' || s[j]=='L') s[j]='5'; 18 if (s[j]=='M' || s[j]=='N' || s[j]=='O') s[j]='6'; 19 if (s[j]=='P' || s[j]=='R' || s[j]=='S') s[j]='7'; 20 if (s[j]=='T' || s[j]=='U' || s[j]=='V') s[j]='8'; 21 if (s[j]=='W' || s[j]=='X' || s[j]=='Y') s[j]='9'; 22 } 23 t=0; 24 for (int j=0;j<s.size();j++) //将处理后的数字字符串转换为整数 25 if (!(s[j]=='Q' || s[j]=='Z' || s[j]=='-')) t=t*10+(s[j]-48); 26 //cout<<t<<endl; 27 h[i]=t; 28 } 29 sort(h,h+n); 30 for (int i=1;i<=n;i++) 31 //从第2个数字开始依次和前1个数字进行比较,循环到最后1个数字的后面停止,以应对最后1个数字和它前面数字相等的情况 32 if (h[i]==h[i-1] && i<=n-1) cnt++; 33 else { 34 if (cnt>1) { 35 t=h[i-1]/10000; 36 if (t<100) cout<<0; 37 if (t<10) cout<<0; 38 cout<<t<<'-'; 39 t=h[i-1]%10000; 40 if (t<1000) cout<<0; 41 if (t<100) cout<<0; 42 if (t<10) cout<<0; 43 cout<<t<<' '<<cnt<<endl; 44 flag=1; 45 } 46 cnt=1; 47 } 48 if (!flag) cout<<"No duplicates."; 49 return 0; 50 }
题号:1003 Hangover
题意:求1/2+1/3+...1/n的和,问需多少项的和能超过给定的值
你能让一叠卡片悬在桌子上多远?如果你有一张卡,你可以创建的最大悬垂长度是半张卡的长度。(我们假设卡片必须垂直于桌子。)若有两张卡,你可以使上面的卡悬垂下面的卡半个卡长,下面的卡悬垂桌子三分之一卡长,总的最大悬垂为 1/2 + 1/3 = 5/6 卡长。 一般情况下,你可以使 n 张牌悬垂 1/2 + 1/3 + 1/4...1/(n+1) 卡的长度,其中最上面的卡悬垂第二张卡 1/2 卡长,第二张悬垂第三张 1/3 卡长,第三张悬垂第四张 1/4 卡长,等等,最下面的卡悬垂桌子 1/(n+1)。 如下图所示。
Input
输入由一个或多个测试样例组成,最后一行包含表示输入结束的数字0.00。每个测试样例都是一条包含正浮点数 c 的单行,c 至少为0.01,最大为5.20;c 将包含三位数字。
Output
对于每个测试样例,输出实现至少 c 长度的悬垂所需的最小卡数。使用样例中显示的确切输出格式。
#include<iostream> using namespace std; float c,t; int ans,fm; int main() { cin>>c; while (c>0) { t=0;ans=0;fm=1; //fm表示分母 while (t<c) { fm++; t+=1.0/fm; ans++; } cout<<ans<<" card(s)"<<endl; cin>>c; } return 0; }
题号:1004 Financial Management
题意:求12个实数的平均值
1 #include<iostream> 2 #include<iomanip> 3 using namespace std; 4 float m,sum; 5 int main() { 6 for (int i=1;i<=12;i++) { 7 cin>>m; 8 sum+=m; 9 } 10 cout<<'$'<<fixed<<setprecision(2)<<sum/12<<endl; 11 return 0; 12 }
题号:1005 I Think I Need a Houseboat
题意:从圆心每年向外扩张100平方英里,几年可以扩张到平面上的某一点?
1 #include<iostream> 2 using namespace std; 3 int n; 4 double x,y,dis,r,j; 5 int main() { 6 cin>>n; 7 for (int i=1;i<=n;i++) { 8 cin>>x>>y; 9 dis=x*x+y*y; 10 for (j=1;;j++) { 11 r=j*100/3.1415; 12 if (r>=dis) break; 13 } 14 cout<<"Property "<<i<<": This property will begin eroding in year "<<j<<'.'<<endl; 15 } 16 cout<<"END OF OUTPUT."; 17 return 0; 18 }
市八 李明知提供
1 #include<iostream> 2 using namespace std; 3 float year,pi=3.1415926,a,b; 4 int n; 5 int main(){ 6 cin>>n; 7 for(int i=1;i<=n;i++) { 8 cin>>a>>b; 9 year=pi*(a*a+b*b)/100; //计算给定坐标到圆心的平方 d 和 πd/100 即需要多少年会到达指定坐标 10 cout<<"Property "<<i<<": This property will begin eroding in year "<<int(year)+1<<"."<<endl; //因为年数必定是实数,这里求大于它的最小整数 11 } 12 cout<<"END OF OUTPUT."; 13 return 0; 14 }
题号:1007 DNA Sorting
题意:给出 m 个长度为 n 的字符串,要求按照字符串的逆序数进行稳定排序
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int n,m,sum,a,c,g; 5 struct dna{ 6 char s[51]; 7 int n; //存储当前字符串的逆序数 8 }str[100]; 9 bool cmp (dna a,dna b) { 10 return a.n<b.n; 11 } 12 int main() { 13 cin>>n>>m; 14 for (int i=0;i<m;i++) cin>>str[i].s; 15 for (int i=0;i<m;i++) { 16 sum=a=c=g=0; //各个字母出现的次数,t最大无需计算出现次数 17 for (int j=n-1;j>=0;j--) //倒过来统计处理 18 switch(str[i].s[j]) { 19 case 'A': a++;break; //a最小,无逆序数 20 case 'C': c++;sum+=a;break; //当前 c 后面出现 a 的次数就是这个 c 的逆序数 21 case 'G': g++;sum+=a;sum+=c;break; 22 case 'T': sum+=a;sum+=c;sum+=g;break; 23 } 24 str[i].n=sum; 25 } 26 sort(str,str+m,cmp); 27 for (int i=0;i<m;i++) cout<<str[i].s<<endl; 28 return 0; 29 }
题号:1008 Maya Calendar/玛雅历
题意:从一种历法转换到另一种历法
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int n,d,m,y,zts,yt,szt,dct; 5 string t,ms; 6 int main() { 7 cin>>n; 8 cout<<n<<endl; 9 for (int i=1;i<=n;i++) { 10 cin>>d>>t>>ms>>y; 11 if (ms=="pop") m=0; 12 if (ms=="no") m=1; 13 if (ms=="zip") m=2; 14 if (ms=="zotz") m=3; 15 if (ms=="tzec") m=4; 16 if (ms=="xul") m=5; 17 if (ms=="yoxkin") m=6; 18 if (ms=="mol") m=7; 19 if (ms=="chen") m=8; 20 if (ms=="yax") m=9; 21 if (ms=="zac") m=10; 22 if (ms=="ceh") m=11; 23 if (ms=="mac") m=12; 24 if (ms=="kankin") m=13; 25 if (ms=="muan") m=14; 26 if (ms=="pax") m=15; 27 if (ms=="koyab") m=16; 28 if (ms=="cumhu") m=17; 29 if (ms=="uayet") m=18; 30 31 zts=y*365+m*20+d; 32 yt=zts/260;zts%=260; 33 szt=zts%13+1; 34 dct=zts%20; 35 36 if (dct==0) t="imix"; 37 if (dct==1) t="ik"; 38 if (dct==2) t="akbal"; 39 if (dct==3) t="kan"; 40 if (dct==4) t="chicchan"; 41 if (dct==5) t="cimi"; 42 if (dct==6) t="manik"; 43 if (dct==7) t="lamat"; 44 if (dct==8) t="muluk"; 45 if (dct==9) t="ok"; 46 if (dct==10) t="chuen"; 47 if (dct==11) t="eb"; 48 if (dct==12) t="ben"; 49 if (dct==13) t="ix"; 50 if (dct==14) t="mem"; 51 if (dct==15) t="cib"; 52 if (dct==16) t="caban"; 53 if (dct==17) t="eznab"; 54 if (dct==18) t="canac"; 55 if (dct==19) t="ahau"; 56 57 cout<<szt<<" "<<t<<" "<<yt<<endl; 58 } 59 return 0; 60 }
题号:1046 Color Me Less
题意:输入的前 16 行为目标集颜色,从第 17 行开始输出其在目标集的最近颜色
1 #include<iostream> 2 using namespace std; 3 int r[16],g[16],b[16],rr,gg,bb,bj; 4 double zxz; 5 int main() { 6 for (int i=0;i<16;i++) cin>>r[i]>>g[i]>>b[i]; 7 while(cin>>rr>>gg>>bb) { 8 if (rr+gg+bb==-3) break; 9 zxz=(rr-r[0])*(rr-r[0])+(gg-g[0])*(gg-g[0])+(bb-b[0])*(bb-b[0]); 10 bj=0; 11 for (int i=1;i<16;i++) 12 if (((rr-r[i])*(rr-r[i])+(gg-g[i])*(gg-g[i])+(bb-b[i])*(bb-b[i]))<zxz) 13 zxz=(rr-r[i])*(rr-r[i])+(gg-g[i])*(gg-g[i])+(bb-b[i])*(bb-b[i]),bj=i; 14 cout<<"("<<rr<<","<<gg<<","<<bb<<") maps to ("<<r[bj]<<","<<g[bj]<<","<<b[bj]<<")"<<endl; 15 } 16 return 0; 17 }
题号:1065 Wooden Sticks
题意:双关键字的最长上升子序列
民办南模 冯天乐提供
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int t,n,zz,ans; 5 struct stick { 6 int l,w; 7 bool f; 8 } wws [5005]; 9 bool cmp(stick x,stick y) { //按长度降序,若长度相同,按重量降序 10 if (x.l==y.l) return x.w>y.w; 11 return x.l>y.l; 12 } 13 int main() { 14 cin>>t; 15 for (int k=0;k<t;k++) { 16 cin>>n; 17 for (int i=0;i<n;i++) cin>>wws[i].l>>wws[i].w,wws[i].f=0; 18 sort(wws,wws+n,cmp); 19 for (int i=0;i<n;i++) 20 if (!wws[i].f) { 21 wws[i].f=1;zz=i;ans++; 22 for (int j=i+1;j<n;j++) 23 if (!wws[j].f && wws[zz].w>=wws[j].w) wws[j].f=1,zz=j; 24 } 25 cout<<ans<<endl; 26 ans=0; 27 } 28 return 0; 29 }
题号:1083 Moving Tables
题意:一条走廊的两侧各有 200 个房间,现给定一些成对的房间相互交换桌子,但是走廊每次只能通过一组搬运,如果两个搬运过程有交叉是不能同时搬运的,要依次来,一次搬运 10 min,问完成所有的搬运的最少用时
PS:统计每个房间有多少搬运过程需要经过,找出最大的房间经过的次数即可
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 int t,n,s,e,tj[401],zdz; 5 int main() { 6 cin>>t; 7 for (int i=0;i<t;i++) { 8 memset(tj,0,sizeof(tj)); 9 cin>>n; 10 for (int j=0;j<n;j++) { 11 cin>>s>>e; 12 if (s>e) swap(s,e); 13 if (s%2==0) s--; 14 if (e%2==1) e++; 15 for (int k=s;k<=e;k++) tj[k]++; 16 } 17 zdz=-1; 18 for (int j=1;j<=400;j++) 19 zdz=max(zdz,tj[j]); 20 cout<<zdz*10<<endl; 21 } 22 return 0; 23 }
题号:1118 Lining Up
题意:给出若干个点的坐标,求在同一直线上的最大的点数
同2606
1 #include<iostream> 2 using namespace std; 3 int n,zb[705][2],zdz,js; 4 int main() { 5 while(cin>>n && n) { 6 for (int i=0;i<n;i++) cin>>zb[i][0]>>zb[i][1]; 7 zdz=0; 8 for (int i=0;i<n;i++) 9 for (int j=i+1;j<n;j++) { //利用两点确定一条直线,先枚举所有直线 10 js=2; 11 for (int k=j+1;k<n;k++) //判断其它的点是否在直线上 12 if ((zb[i][0]-zb[j][0])*(zb[j][1]-zb[k][1])==(zb[j][0]-zb[k][0])*(zb[i][1]-zb[j][1])) js++; 13 //斜率比较,用乘法不要用除法 14 if (js>zdz) zdz=js; 15 } 16 cout<<zdz<<endl; 17 } 18 return 0; 19 }
题号:1207 The 3n + 1 problem
题意:求区间内冰雹猜想的最大循环长度。
计算机科学的问题通常被列为属于某一个特定类的问题(如NP、不可解、递归)。这个问题是请你分析算法的一个特性:算法的分类对所有可能的输入是未知的
考虑下述算法:
1 输入
2 打印
3 如果 n 等于 1,则停止
4 如果 n 是奇数,n = 3n + 1
5 否则 n = n / 2
6 跳转到第 2 步
给出输入“22”,则打印下述数字序列:22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
人们猜想,对于任何整数的输入值,上述算法将终止(当 1 被打印时)。尽管这一算法很简单,但还不清楚这一猜想是否是正确的。然而,目前已经验证,对所有的 0 < n < 1,000,000 的整数,该命题正确。(实际上,除此之外还有更多的数字)
给定一个输入 n,确定在“1”被打印前被打印数字的个数。这样的个数被称为 n 的循环长度。在上面的样例中,22 的循环长度是 16。
对于任意的两个整数 i 和 j,你将要计算在 i 和 j 之间的整数中,循环长度的最大值。
Input
输入是整数 i 和 j 组成的整数对序列,每对一行。所有的整数小于 10000 且大于 0。
你应该处理所有的整数对,并且确定每对 i 和 j 所确定的整数范围中最大的循环长度。
Output
对输入的每对整数 i 和 j,请输出 i、j 和在 i 和 j 之间(包括 i 和 j)的所有整数中循环长度的最大值。这三个数字在一行输出,彼此之间至少用一个空格分开,并且每输入一行输出一行。在输出中 i 和 j 按输入的次序出现,然后是最大的循环长度(在同一行中)。
1 #include<iostream> 2 using namespace std; 3 int i,j,t,zdz,len; 4 int main(){ 5 while(cin >> i >> j) { 6 cout << i << ' ' << j << ' '; 7 if (i > j) t = i , i = j , j = t; 8 zdz = 0; 9 for (int k = i ; k <= j ; k++) { 10 len = 1; 11 t = k; 12 while (t != 1) { 13 len++; 14 if (t % 2 == 1) t=t * 3 + 1; 15 else t /= 2; 16 } 17 if (len > zdz) zdz = len; 18 } 19 cout << zdz << endl; 20 } 21 return 0; 22 }
题号:1218 THE DRUNK JAILER
题意:类似开灯游戏
PS:n <= 100
1 #include<iostream> 2 using namespace std; 3 int f[101],n,m,k,ans; 4 int main() { 5 cin>>n; 6 for (int i=1;i<=n;i++) { 7 cin>>m; 8 for (int j=1;j<=m;j++) f[j]=0; //0 表示开,首先打开所有牢房 9 for (int j=2;j<=m;j++) { 10 k=j; 11 while (k<=m) { 12 f[k]=1-f[k]; //牢房开关状态取反 13 k=k+j; 14 } 15 } 16 ans=0; 17 for (int j=1;j<=m;j++) 18 if (f[j]==0) ans++; 19 cout<<ans<<endl; 20 } 21 return 0; 22 }
华二 沈思贤提供
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 int main(){ 5 int n,x; 6 cin>>n; 7 while(n--){ 8 cin>>x; 9 cout<<int(sqrt(double(x)))<<"\n"; 10 } 11 return 0; 12 }
市八 李明知提供
思路:
考虑有哪些位置中的a[i]值为 1,即 i 这个位置被改变了奇数次,也就是 i 的约数个数为奇数。
任何一个自然数(完全平方数除外)都可以拆成 a*b(a≠b)的形式,a 和 b 成双成对,所以这些自然数会有偶数个约数。
所以这道题的实际目的是寻找小于等于 n 的完全平方数的个数。
那寻找完全平方数的个数跟 sqrt 有什么关系?
对于任何一个正整数,我们都可以拆分成 x*x+y(y 可以等于 0)的形式。
小于等于 x*x+y 的完全平方数有:1*1,2*2,3*3.....x*x
也就是说,小于等于 x*x+y 的完全平方数的个数有 x 个,也就是 sqrt(x*x+y)向下取整,即 sqrt(n)向下取整。
题号:1247 Magnificent Meatballs
题意:读入一个环上的数字,一个人在环头,一人在环尾,分别按顺时针和逆时针走(直至汇合),如果能把环的数字和平分,则输出两个人停下来的位置
1 #include<iostream> 2 using namespace std; 3 int n,m[31],sum; 4 int main() { 5 while(cin>>n && n) { 6 sum=0; 7 for (int i=1;i<=n;i++) cin>>m[i],sum+=m[i]; 8 if (sum%2==1) cout<<"No equal partitioning."<<endl; 9 else { 10 sum/=2; 11 for (int i=1;i<=n;i++) { 12 sum-=m[i]; 13 if (sum==0) {cout<<"Sam stops at position "<<i<<" and Ella stops at position "<<i+1<<"."<<endl;break;} 14 else if (sum<0) {cout<<"No equal partitioning."<<endl;break;} 15 } 16 } 17 } 18 return 0; 19 }
题号:1298 The Hardest Problem Ever/史上最难的问题
题意:字符串移位破解密码
PS:本题同3749
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 string s,t; 5 int main() { 6 cin>>t; 7 while (t!="ENDOFINPUT") { 8 cin.ignore(1024,'\n'); //把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去 9 getline(cin,s); 10 for (int i=0;i<s.size();i++) 11 if (s[i]>='A' && s[i]<='Z') 12 if (s[i]>'E') cout<<char(s[i]-5); 13 else cout<<char(s[i]+21); 14 else cout<<s[i]; 15 cout<<endl; 16 cin>>t; 17 cin>>t; 18 } 19 return 0; 20 }
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 string s,t; 5 int main() { 6 getline(cin,t); 7 while (t!="ENDOFINPUT") { 8 getline(cin,s); 9 for (int i=0;i<s.size();i++) 10 if (s[i]>='A' && s[i]<='Z') 11 if (s[i]>'E') cout<<char(s[i]-5); 12 else cout<<char(s[i]+21); 13 else cout<<s[i]; 14 cout<<endl; 15 getline(cin,t); 16 getline(cin,t); 17 } 18 return 0; 19 }
题号:1504 Adding Reversed Numbers
题意:读入两个正整数,将这两个数反转后相加,得到的结果再次反转后输出
1 #include<iostream> 2 using namespace std; 3 int n,a,b,c,d,sum,ans; 4 int main() { 5 cin>>n; 6 for (int i=0;i<n;i++) { 7 cin>>a>>b; 8 c=d=ans=0; 9 while (a>0) { 10 c=c*10+a%10; 11 a/=10; 12 } 13 while (b>0) { 14 d=d*10+b%10; 15 b/=10; 16 } 17 sum=c+d; 18 while (sum>0) { 19 ans=ans*10+sum%10; 20 sum/=10; 21 } 22 cout<<ans<<endl; 23 } 24 return 0; 25 }
题号:1517 u Calculate e
题意:输出由题示公式生成的 e 的近似值,循环 n 从 0 到 9 的依公式计算得到的 e 的值,输出的开头应照样例所示
1 #include<iostream> 2 #include<iomanip> 3 using namespace std; 4 int jc=1; 5 double ans; 6 int main() { 7 cout<<"n e"<<endl; 8 cout<<"- -----------"<<endl; 9 for (int i=0;i<=9;i++) { 10 if (i>0) jc*=i; 11 ans+=1.0/jc; 12 cout<<i<<' '<<fixed<<setprecision(9)<<ans<<endl; 13 } 14 return 0; 15 }
题号:1528 Perfection
题意:求一个数所有因子之和(不含这个数本身),比较这个数与它的因子和的大小关系
PS:1 的因子和为 0
1 #include<iostream> 2 #include<iomanip> 3 using namespace std; 4 int n,ans; 5 int main() { 6 cout<<"PERFECTION OUTPUT"<<endl; 7 cin>>n; 8 while (n>0) { //0 尾版 9 cout<<setw(5)<<n; 10 if (n==1) { 11 cout<<" DEFICIENT"<<endl; 12 cin>>n; 13 continue; 14 } 15 ans=1; 16 for (int i=2;i<=n/2;i++) 17 if (n%i==0) ans+=i; 18 if (ans>n) cout<<" ABUNDANT"; 19 if (ans==n) cout<<" PERFECT"; 20 if (ans<n) cout<<" DEFICIENT"; 21 cout<<endl; 22 cin>>n; 23 } 24 cout<<"END OF OUTPUT"; 25 return 0; 26 }
题号:1547 Clay Bully
题意:老师发给每个学生的橡皮泥体积相同,读入每位同学橡皮泥的长宽高尺寸,找出谁抢了谁的橡皮泥
1 #include<iostream> 2 #include<string> //因为涉及字符串赋值,需加字符串头文件,poj 不支持 cstring 3 using namespace std; 4 int n,zdz,zxz,c,k,g; 5 string t,r,v; 6 int main() { 7 while (1) { 8 cin>>n; 9 if (n==-1) break; 10 zxz=250;zdz=0; 11 for (int i=0;i<n;i++) { 12 cin>>c>>k>>g>>t; 13 if (c*k*g>zdz) zdz=c*k*g,r=t; 14 if (c*k*g<zxz) zxz=c*k*g,v=t; 15 } 16 cout<<r<<" took clay from "<<v<<'.'<<endl; 17 } 18 return 0; 19 }
题号:1552 Doubles
题意:输入一组数据(以 0 表示数据的结束),求这组数据中有几个数是其它数字的 2 倍
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int t,js,s[20],ans; 5 int main() { 6 while (1) { 7 cin>>t; 8 if (t==-1) break; 9 js=0; 10 s[js]=t; 11 while (1) { 12 js++; 13 cin>>s[js]; 14 if (s[js]==0) break; 15 } 16 sort(s,s+js); 17 ans=0; 18 for (int i=0;i<js;i++) 19 for (int j=i+1;j<js;j++) 20 if (s[i]*2==s[j]) ans++; 21 cout<<ans<<endl; 22 } 23 return 0; 24 }
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int n,ans; 5 vector<int> v; 6 int main() { 7 while(cin>>n,n!=-1) { 8 if(n!=0) v.push_back(n); 9 else { 10 for (vector<int>::iterator it1=v.begin();it1!=v.end();it1++) 11 for(vector<int>::iterator it2=v.begin();it2!=v.end();it2++) 12 if(*it1*2==*it2) ans++; 13 cout<<ans<<endl; 14 v.clear(); 15 ans=0; 16 } 17 } 18 return 0; 19 }
题号:1658 Eva's Problem
题意:读入数列前四项,判断等差还是等比,求第五项
PS:输出数列的所有五项,而不是第五项
1 #include<iostream> 2 using namespace std; 3 int t,a,b,c,d; 4 int main(){ 5 cin >> t; 6 for(int i = 0 ; i < t ; i++) { 7 cin >> a >> b >> c >> d; 8 cout << a << ' ' << b << ' ' << c << ' ' << d << ' '; 9 if (2 * b == a + c && 2 * c == b + d) cout << d + d - c << endl; 10 else cout << d * d / c << endl; 11 } 12 return 0; 13 }
题号:1663 Number Steps
题意:按照图片方式排列的点,想知道在点(x,y)上是否有写数字
1 #include<iostream> 2 using namespace std; 3 int n,x,y; 4 int main() { 5 cin>>n; 6 for (int i=0;i<n;i++) { 7 cin>>x>>y; 8 if (x>=0 && y>=0) 9 if (x==y) 10 if (x%2) cout<<x*2-1; 11 else cout<<x*2; 12 else if (x-2==y) 13 if (x%2) cout<<x*2-3; 14 else cout<<(x-1)*2; 15 else cout<<"No Number"; 16 cout<<endl; 17 } 18 return 0; 19 }
题号:P1753 Flip Game
题意:输入一个 4 行 4 列的字符数组(只包含字符 b 和 w),求将这字符串改为只包含一种字符的最小步数;改变规则:每改变一个点,将这个点和这个点的四个方向(上,下,左,右)上的点改变;改变方式:b==>w,w==>b;
1 #include<iostream> 2 using namespace std; 3 char f[5][5]; 4 bool flag; 5 int js=2147483647,zbx[5]={0,0,1,-1,0},zby[5]={1,-1,0,0,0}; 6 void change(int x,int y) { 7 for (int i=0;i<5;i++) //依次校验四个方向和本身五个点位 8 if (x+zbx[i]>=1 && x+zbx[i]<=4 && y+zby[i]>=1 && y+zby[i]<=4) //校验是否在范围内 9 if (f[x+zbx[i]][y+zby[i]]=='b') f[x+zbx[i]][y+zby[i]]='w'; 10 else f[x+zbx[i]][y+zby[i]]='b'; 11 } 12 bool judge() { 13 char ch=f[1][1]; 14 for (int i=1;i<=4;i++) 15 for (int j=1;j<=4;j++) 16 if (f[i][j]!=ch) return 0; 17 return 1; 18 } 19 void dfs(int x,int y,int step) { 20 for (int i=1;i<=4;i++) 21 for (int j=1;j<=4;j++) { 22 if (i<x || i==x && j<=y) continue; 23 change(i,j); //改变 24 if (judge()) 25 if (step<js) js=step,flag=1; //改变成功并找到更小的步数 26 else {change(i,j);return;} //改变成功但步数大于最小值,则回溯后剪枝 27 dfs(i,j,step+1); //改变不成功则继续往后搜索 28 change(i,j); //回溯 29 } 30 } 31 int main() { 32 for (int i=1;i<=4;i++) 33 for (int j=1;j<=4;j++) cin>>f[i][j]; 34 if (judge()) flag=1,js=0; 35 else dfs(1,0,1); //从第一个格子的左边开始准备搜索 36 if (flag) cout<<js<<endl; 37 else cout<<"Impossible"<<endl; 38 return 0; 39 }
题号:1804 Brainman
题意:让一串无序数,在只能相邻数字交换的前提下,最短的次数变成有序,求该最短次数。
1 #include<iostream> 2 using namespace std; 3 int num,n,ele[1010],cnt; 4 int main() { 5 cin>>num; 6 for (int i=1;i<=num;i++) { 7 cin>>n; 8 cnt=0; 9 for (int j=1;j<=n;j++) cin>>ele[j]; 10 for (int j=1;j<=n-1;j++) //冒泡排序,若数据规模大可以用归并排序 11 for (int k=1;k<=n-j;k++) 12 if (ele[k]>ele[k+1]) swap(ele[k],ele[k+1]),cnt++; 13 cout<<"Scenario #"<<i<<":"<<endl<<cnt<<endl<<endl; 14 } 15 return 0; 16 }
题号:1939 Diplomatic License
题意:给定平面中 n 个坐标,按顺序输出两两相邻的坐标的中点
1 #include<iostream> 2 #include<iomanip> 3 using namespace std; 4 int n; 5 long long sd[200][2]; 6 int main() { 7 while(cin>>n) { 8 cout<<n<<' '; 9 for (int i=0;i<n;i++) cin>>sd[i][0]>>sd[i][1]; 10 for (int i=0;i<n-1;i++) cout<<fixed<<setprecision(6)<<(sd[i][0]+sd[i+1][0])/2.0<<' '<<(sd[i][1]+sd[i+1] 11 12 [1])/2.0<<' '; 13 cout<<fixed<<setprecision(6)<<(sd[n-1][0]+sd[0][0])/2.0<<' '<<(sd[n-1][1]+sd[0][1])/2.0<<' '<<endl; 14 } 15 return 0; 16 }
题号:2000 Gold Coins
题意:国王给骑士付工资,第一天 1 枚金币,后面两天每天 2 枚,再后面三天每天 3 枚···输入天数,输出骑士在这些天里获得的总钱数
1 #include<cstdio> 2 using namespace std; 3 int k,t,d,ans; 4 int main() { 5 while(1) { 6 scanf("%d",&k); 7 if (k==0) break; 8 t=d=1;ans=0; 9 for (int i=0;i<k;i++) { 10 ans+=t; //累加当前每天的工资 11 d--; //当前工资发放天数减一 12 if (d==0) {t++;d=t;} //N枚金币发放完N天后 13 } 14 printf("%d %d\n",k,ans); 15 } 16 return 0; 17 }
1 #include<cstdio> 2 using namespace std; 3 int k,kk,t=1,ans; 4 int main() { 5 while(1) { 6 scanf("%d",&k); 7 if (k==0) break; 8 t=1;ans=0; 9 kk=k; 10 while (k>=t) { 11 ans+=t*t; //t个金币发t天 12 k-=t; 13 t++; 14 } 15 printf("%d %d\n",kk,ans+k*t); 16 } 17 return 0; 18 }
题号:2017 Speed Limit
题意:读入速度和时间刻度,求总路程
2004耿晨旭提供
1 #include<iostream> 2 using namespace std; 3 int n,s,qt,t,ans; 4 int main() { 5 while(1) { 6 cin>>n; 7 if (n==-1) break; 8 ans=0;qt=0; 9 for (int i=1;i<=n;i++) { 10 cin>>s>>t; 11 ans=ans+s*(t-qt); 12 qt=t; 13 } 14 cout<<ans<<" miles"<<endl; 15 } 16 return 0; 17 }
题号:2027 No Brainer
题意:比较两个整数大小
1 #include<iostream> 2 using namespace std; 3 int n,x,y; 4 int main(){ 5 cin >> n; 6 for(int i = 0 ; i < n ; i++) { 7 cin >> x >> y; 8 if (x >= y) cout << "MMM BRAINS" << endl; 9 else cout << "NO BRAINS" << endl; 10 } 11 return 0; 12 }
题号:2028 When Can We Meet?
题意:给出每位委员会成员方便的日期,输出可以召开会议的最早日期
PS:最佳开会日期不是最早达到法定人数的日期,而是人数最多的最早日期
1 #include<iostream> 2 using namespace std; 3 int q,n,m,day,fb[101],ans,ansi; 4 int main() { 5 while (cin>>q>>n) { 6 if (q+n==0) break; 7 for (int i=1;i<=100;i++) fb[i]=0;ans=ansi=0; //初始化 8 9 for (int i=0;i<q;i++) { 10 cin>>m; 11 for (int j=0;j<m;j++) { 12 cin>>day; 13 fb[day]++; 14 } 15 } 16 for (int i=1;i<100;i++) 17 if (fb[i]>=n && fb[i]>ans) ans=fb[i],ansi=i; 18 cout<<ansi<<endl; 19 } 20 return 0; 21 }
题号:2140 Herd Sums
题意:给定一个正整数 n,求连续正整数的和为 n 的组数。比如对于15,有15,7+8,4+5+6,1+2+3+4+5, 共4种;对于10,有10,1+2+3+4,共2种
解法一:枚举
1 #include<iostream> 2 using namespace std; 3 int n,ans=1,t,sum; 4 int main() { 5 cin>>n; 6 for(int i=1;i<=n/2;i++) { 7 sum=0;t=i; 8 while (sum<n) sum+=t,t++; 9 if(n==sum) ans++; 10 } 11 cout<<ans; 12 return 0; 13 }
解法二:
市八 李明知提供
题目中说求连续数列且和为n的个数,我们不妨设 a,a+1,a+2……a+k 是一组符合条件的解,所以 a+a+1+a+2……+a+k=n,整理后,可获得 (k+1)(a+k/2)=n ①
n 为整数,k+1 为整数,(a+k/2) 为整数,k 为偶数,k+1 为奇数,
当 n 和 k+1 都是确定的数时,a 为定值,
故解为 n 的奇因子个数。
测试数据中 n=15,有 4 组连续的数列和为 15
15的奇因数有:1,3,5,15
15=3*5 k=2 a=4 得 4+4+1+4+2 即 4+5+6
15=5*3 k=4 a=3 即 1+2+3+4+5
15=1*15 k=0 a=15 即 15
15=15*1 k=14 a=-6 得 -6-5-4-3-2-1+0+1+2+3+4+5+6+7+8 前13项抵消后,剩下7和8,即 7+8
1 #include<iostream> 2 using namespace std; 3 int n,ans; 4 int main() { 5 cin>>n; 6 for(int i=1;i<=n;i+=2) 7 if(n%i==0) ans++; 8 cout<<ans; 9 return 0; 10 }
题号:2159 Ancient Cipher
题意:读入两个字符串即密文和原文,判断密文是否可由原文经凯撒(置换)加密和乱序加密得到
PS:统计两个字符串中字母出现的次数并进行排序,再比较两个频数序列是否相同,相同说明可由明文串经变换得密文串
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 using namespace std; 5 string mw,yw; 6 int tja[26],tjb[26]; 7 bool flag; 8 int main() { 9 cin>>mw>>yw; 10 for (int i=0;i<mw.size();i++) 11 tja[mw[i]-'A']++,tjb[yw[i]-'A']--; 12 sort(tja,tja+26); 13 sort(tjb,tjb+26); 14 for (int i=0;i<26;i++) 15 if (tja[i]!=tjb[i]) flag=1; 16 if (flag) cout<<"NO"; 17 else cout<<"YES"; 18 return 0; 19 }
题号:2209 The King
题意:第一个数是数列的长度,第二个数字是指数,第三行是数列,即底数。从数列中选择任意多个,使得他们每个求幂后的和最大
1 #include<iostream> 2 using namespace std; 3 int n,z,s,t,ans; 4 int main() { 5 cin>>n; 6 cin>>z; 7 for (int i=0;i<n;i++) { 8 cin>>s; 9 if (s>0 || z%2==0) { //底数为正或指数为偶数,则幂指乘方结果为正,做累加 10 t=1; 11 for (int j=0;j<z;j++) t*=s; 12 ans+=t; 13 } 14 } 15 cout<<ans; 16 return 0; 17 }
题号:2262 Goldbach's Conjecture
题意:证明任意一个大于 4 的偶数 n 都可以写成两个奇素数(非2质数)之和, 其中 n∈[6,1000000)且为偶数
1 #include<iostream> 2 using namespace std; 3 int n; 4 bool zs(int x) { 5 for (int i=2;i*i<=x;i++) 6 if (x%i==0) return 0; 7 return 1; 8 } 9 int main() { 10 while(1) { 11 cin>>n; 12 if (n==0) break; 13 for (int a=3;;a+=2) 14 if (zs(a) && zs(n-a)) {cout<<n<<" = "<<a<<" + "<<n-a<<endl;break;} 15 } 16 return 0; 17 }
打表
1 #include<iostream> 2 using namespace std; 3 int n,t; 4 bool zs[1000001]; 5 int main() { 6 for (int i=2;i<=1000000;i++) zs[i]=1; 7 for (int i=2;i<=1000;i++) { 8 if (zs[i]) { 9 t=i*2; 10 while(t<=1000000) zs[t]=0,t+=i; 11 } 12 } 13 while(1) { 14 cin>>n; 15 if (n==0) break; 16 for (int a=3;;a+=2) 17 if (zs[a] && zs[n-a]) {cout<<n<<" = "<<a<<" + "<<n-a<<endl;break;} 18 } 19 return 0; 20 }
题号:2301 Beat the Spread!
题意:给你俩个球队的分数和还有分数差的绝对值,请你计算出两个球队的分数
PS:列两个二元一次方程可以求解,注意解得的分数是必须是正整数
1 #include<iostream> 2 using namespace std; 3 int n,s,d; 4 int main() { 5 cin>>n; 6 for (int i=1;i<=n;i++) { 7 cin>>s>>d; 8 if (s>=d && (s+d)%2==0 && (s-d)%2==0) cout<<(s+d)/2<<' '<<(s-d)/2; 9 else cout<<"impossible"; 10 cout<<endl; 11 } 12 return 0; 13 }
题号:2388 Who's in the Middle
题意:给定 n 个数,输出中位数
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int n,m[10001]; 5 int main() { 6 cin>>n; 7 for (int i=1;i<=n;i++) cin>>m[i]; 8 sort(m+1,m+n+1); 9 cout<<m[n/2+1]; 10 return 0; 11 }
桶排序
1 #include<iostream> 2 using namespace std; 3 int n,s,t[1000001],k,zz; 4 int main() { 5 cin>>n; 6 for (int i=0;i<n;i++) cin>>s,t[s]++; 7 k=n/2+1; 8 zz=1000000; 9 while(k>0) { //从最大的数开始倒过来一个一个找,并计数 10 while (t[zz]==0) zz--; 11 t[zz]--;k--; 12 } 13 cout<<zz; 14 return 0; 15 }
题号:2390 Bank Interest
题意:读入利率、本金和存款年数,输出Y年后的可以拿到多少钱(答案为整数,并且不做四舍五入)
PS:float精度不够,需用double
1 #include<iostream> 2 using namespace std; 3 int y; 4 double r,m; 5 int main() { 6 cin>>r>>m>>y; 7 for (int i=1;i<=y;i++) m*=(1+r/100); 8 y=m; 9 cout<<y<<endl; 10 return 0; 11 }
题号:2459 Feed Accounting
题意:按题意从第 d 天开始,倒过来查找
1 #include<iostream> 2 using namespace std; 3 int c,f1,f2,d,s,e,vis[2005]; 4 int main() { 5 cin>>c>>f1>>f2>>d; 6 for (int i=0;i<c;i++) { 7 cin>>s>>e; 8 vis[s]++;vis[e+1]--; 9 } 10 for (int i=2;i<=d;i++) vis[i]+=vis[i-1]; 11 while(f1!=f2) f2+=vis[d--]; 12 cout<<d+1; 13 return 0; 14 }
题号:2509 Peter's smokes
题意:彼得有 n 支雪茄,每 k 个烟头可以换一支新雪茄,问彼得最多可以吸多少支雪茄 ?
1 #include<iostream> 2 using namespace std; 3 int n,k,ans; 4 int main(){ 5 while(cin >> n >> k) { 6 ans = n; 7 while(n >= k) { 8 ans += n / k; 9 n = n / k + n % k; 10 } 11 cout << ans << endl; 12 } 13 return 0; 14 }
题号:2521 How much did the businessman lose
题意:商人做生意有亏有赚,如果有人给了假币,商人会亏损:货物价格+找钱价格, 输入:N 商品成本价格,M 销售的价格,P 客户给的假钱价格,C 找钱的价格,0 0 0 0 代表输入结束 求商人赔了多少钱
1 #include<iostream> 2 using namespace std; 3 int n,m,p,c; 4 int main() { 5 cin>>n>>m>>p>>c; 6 while (n+m+p+c) { 7 cout<<p-(m-n)<<endl; 8 cin>>n>>m>>p>>c; 9 } 10 return 0; 11 }
题号:2606 Rabbit hunt
题意:给出若干个点的坐标,求在同一直线上的最大的点数
同1118
1 #include<iostream> 2 using namespace std; 3 int n,zb[205][2],zdz,js; 4 int main() { 5 cin>>n; 6 for (int i=0;i<n;i++) cin>>zb[i][0]>>zb[i][1]; 7 for (int i=0;i<n;i++) 8 for (int j=i+1;j<n;j++) { //利用两点确定一条直线,先枚举所有直线 9 js=2; 10 for (int k=j+1;k<n;k++) //判断其它的点是否在直线上 11 if ((zb[i][0]-zb[j][0])*(zb[j][1]-zb[k][1])==(zb[j][0]-zb[k][0])*(zb[i][1]-zb[j][1])) js++; 12 //斜率比较,用乘法不要用除法 13 if (js>zdz) zdz=js; 14 } 15 cout<<zdz<<endl; 16 return 0; 17 }
题号:2636 Electrical Outlets
题意:给你拖线板的数量和每个拖线板提供的插孔数,输出可以给多少设备供电
1 #include<iostream> 2 using namespace std; 3 int n,k,ans,ou; 4 int main() { 5 cin>>n; 6 for (int i=1;i<=n;i++) { 7 ans=0; 8 cin>>k; 9 for (int j=1;j<=k;j++) { 10 cin>>ou; 11 ans+=ou; 12 } 13 cout<<ans-k+1<<endl; 14 } 15 return 0; 16 }
题号:2656 Unhappy Jinjin
题意:Jinjin要学习 N 天,分为上课时间和补习时间,如果他每天学习的总时间大于 8 小时,他就会不开心,如果他在 N 天之内有过不开心,则输出上课时间最长的那一天(天数从 1 开始,如果答案不唯一,则输出最早的那一天),若没有不开心,就输出 0
1 #include<iostream> 2 using namespace std; 3 int n,a,b,anss,ansd; 4 int main() { 5 while(1) { 6 cin>>n; 7 if (n==0) break; 8 anss=-1;ansd=0; 9 for (int i=1;i<=n;i++) { 10 cin>>a>>b; 11 if (a+b>anss) anss=a+b,ansd=i; 12 } 13 if (anss<=8) cout<<0; 14 else cout<<ansd; 15 cout<<endl; 16 } 17 return 0; 18 }
题号:2665 Trees
题意:给你道路的总长和一些区段,求去除这些区段后的剩余长度
PS:每一个区段不相互重叠
1 #include<iostream> 2 using namespace std; 3 int l,m,s,e; 4 int main() { 5 cin>>l>>m; 6 while (l+m>0) { 7 l++; 8 for (int i=1;i<=m;i++) { 9 cin>>s>>e; 10 l=l-(e-s+1); 11 } 12 cout<<l<<endl; 13 cin>>l>>m; 14 } 15 return 0; 16 }
题号:2739 Sum of Consecutive Prime Numbers
题意:给出一个正整数,问这个数能否等于一系列连续的质数的和
1 #include<iostream> 2 using namespace std; 3 bool p[10001]; 4 int t,s,ans,sum; 5 int main() { 6 for (int i=2;i<=10000;i++) p[i]=1; 7 for (int i=2;i<=100;i++) 8 if (p[i]) { 9 t=i*2; 10 while (t<=10000) p[t]=0,t+=i; 11 } 12 // for (int i=2;i<=100;i++) 13 // if (p[i]) cout<<i<<' '; 14 //以上筛法求出10000以内质数表 15 while(cin>>t,t!=0) { 16 ans=0;s=2; 17 while(s<=t) { //从2开始枚举每一个起点 18 sum=0; 19 for (int j=s;j<=t;j++) //从当前起点开始累加连续质数 20 if (p[j]) { 21 sum+=j; 22 if (sum==t) {ans++;break;} 23 if (sum>t) break; 24 } 25 s++; 26 while(!p[s]) s++; //搜索下一个质数起点 27 } 28 cout<<ans<<endl; 29 } 30 return 0; 31 }
题号:2998 Hardware
题意:读入门牌号,计算需要做多少个数字
民办南模 冯天乐提供
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 int n,l,r,a,pos,zs,total,ans[10]; 5 string s; 6 void count(int x) { //将每个int类型的门牌号按位拆开计入ans 7 while(x>0) { 8 ans[x%10]++; 9 x/=10; 10 } 11 } 12 int main() { 13 cin>>n; 14 for (int i=0;i<n;i++) { 15 pos=total=0; //初始化当前已读入门牌号数量与需要做的数字总数 16 for (int i=0;i<10;i++) ans[i]=0; 17 cin.ignore(1024,'\n'); //把回车(包括回车)之前的所有字符从输入缓冲(流)中清除出去 18 getline(cin,s); //读入路名 19 cout<<s<<endl; 20 cin>>zs; //读入建筑总数 21 getline(cin,s); 22 cout<<zs<<s<<endl; 23 while (cin>>s) { 24 if (s[0]=='+') { //连续门牌号 25 cin>>l>>r>>a; 26 for (int i=l;i<=r;i+=a) pos++,count(i); 27 } else if (s[0]>='0'&&s[0]<='9') { //单个门牌号 28 pos++; 29 for(int i=0;i<s.size();i++) ans[s[i]-'0']++; //将字符转化为数字计入ans 30 } 31 if (pos==zs) { //若这条街门牌号数量已全部计算完毕 32 for (int i=0;i<10;i++) cout<<"Make "<<ans[i]<<" digit "<<i<<endl,total+=ans[i]; 33 if(total>1) cout<<"In total "<<total<<" digits"<<endl; 34 else cout<<"In total 1 digit"<<endl; 35 break; //读入新的订单 36 } 37 } 38 } 39 return 0; 40 }
题号:3006 Dirichlet's Theorem on Arithmetic Progressions
题意:读入等差数列的首项 a 和公差 d,求数列中的第 n 个质数
1 #include<iostream> 2 using namespace std; 3 int a,d,n,cnt; 4 bool pzs(int x) { 5 if (x<2) return 0; 6 for (int i=2;i*i<=x;i++) 7 if (x%i==0) return 0; 8 return 1; 9 } 10 int main() { 11 while (cin>>a>>d>>n,a+d+n!=0) { 12 cnt=0; 13 while (cnt<n) { 14 if (pzs(a)) cnt++; 15 a+=d; 16 } 17 cout<<a-d<<endl; 18 } 19 return 0; 20 }
题号:3030 Nasty Hacks
题意:通过比较不做广告的收益、做广告后的收益以及广告成本三者数量关系来决定做广告、不做广告或者无所谓
1 #include<iostream> 2 using namespace std; 3 int n,r,e,c; 4 int main() { 5 cin>>n; 6 for (int i=1;i<=n;i++) { 7 cin>>r>>e>>c; 8 if (r+c<e) cout<<"advertise"; 9 if (r+c==e) cout<<"does not matter"; 10 if (r+c>e) cout<<"do not advertise"; 11 cout<<endl; 12 } 13 return 0; 14 }
题号:3062 Celebrity jeopardy
题意:读取字符串,并原样输出
PS:字符串中有空格和换行符
1 #include<cstdio> 2 using namespace std; 3 char s[100]; 4 int main() { 5 while(gets(s)) puts(s); 6 return 0; 7 }
1 #include<iostream> 2 #include<string> //用#include<cstring>会报编译错误 3 using namespace std; 4 string s; 5 int main() { 6 while(getline(cin,s)) cout<<s<<endl; 7 return 0; 8 }
题号:3086 Triangular Sums
题意:W(n) = SUM[k = 1…n; k * T(k + 1)], T(n) = 1 + … + n
2004耿晨旭提供
1 #include<iostream> 2 using namespace std; 3 int n,t,ans; 4 int T(int x) { 5 int sum=0; 6 for (int i=1;i<=x;i++) sum=sum+i; 7 return sum; 8 } 9 int main() { 10 cin>>n; 11 for (int i=1;i<=n;i++) { 12 cin>>t; 13 ans=0; 14 for (int j=1;j<=t;j++) { 15 ans=ans+j*T(j+1); 16 } 17 cout<<i<<' '<<t<<' '<<ans<<endl; 18 } 19 return 0; 20 }
1 #include<iostream> 2 using namespace std; 3 int n,t,sum,ans; 4 int main() { 5 cin>>n; 6 for (int i=1;i<=n;i++) { 7 cin>>t; 8 sum=1; 9 ans=0; 10 for (int j=1;j<=t;j++) { 11 sum=sum+j+1; 12 ans=ans+j*sum; 13 } 14 cout<<i<<' '<<t<<' '<<ans<<endl; 15 } 16 return 0; 17 }
华二 沈思贤提供
以 k=3 为例:
W(3)=1*T(2)+2*T(3)+3*T(4)=1*2*3/2+2*3*4/2+3*4*5/2
=(1*2*3*4-1*2*3*0+2*3*4*5-2*3*4*1+3*4*5*6-3*4*5*2)/4/2
=(3*4*5*6)/8
通项为:
w(k)=k*(k+1)*(k+2)*(k+3)/8
k 最大为 300,w(k) 最大值为 8262991800,超出 int 范围。
连续 4 项正整数的积必为 8 的倍数。
1 #include<iostream> 2 using namespace std; 3 int n,k; 4 int main() { 5 cin>>n; 6 for (int i=1;i<=n;i++) { 7 cin>>k; 8 cout<<i<<' '<<k<<' '; 9 if (k%2) cout<<(k+3)*(k+1)/8*(k+2)*k; //第2、4项为奇数,先除8 10 else cout<<(k+2)*k/8*(k+3)*(k+1); //第1、3项为奇数 11 cout<<endl; 12 } 13 return 0; 14 }
题号:P3094 Quicksum
题意:给定一个字符串,求字符串中每个字符对应的值和它所在位置的乘积之和
市八 李明知提供
1 #include<string.h> 2 #include<cstdio> 3 using namespace std; 4 char c[300]; 5 int ans; 6 int main() { 7 while((gets(c)) && (c[0]!='#')) { 8 ans=0; 9 for(int i=0;i<strlen(c);i++) 10 if((c[i]>='A') && (c[i]<='Z')) 11 ans+=(c[i]-'A'+1)*(i+1); //每个字符对应的值和它所在位置的乘积之和 12 printf("%d\n",ans); 13 } 14 return 0; 15 }
题号:3210 Coins
题意:n 个硬币,无论是怎么摆(正面或是反面),能否找到一个最小值 x,使得这 n 个硬币,通过 x 次翻转,必能到达全正或是全反的状态。能,则输出 x 的值。不能,则输出“No Solution!”
市二初 张德弈提供
思路:分情况讨论
若 n 为偶数:
假设向上的数量为偶数,则向下的数量也一定为偶数,所以这个最小值 x 也一定是偶数。
假设向上的数量是奇数,则向下的数量也是奇数,这个最小值 x 一定得是奇数。
此时。得到的 x 在两种情况中互相矛盾,所以偶数的话,要输出“No Solution!”
若 n 为奇数:
n 为奇数的话,只有一种情况,向上的数量是 m,向下的数量是 n-m,两者必定一奇,一偶。
可以发现偶数次翻转即可完成任务,只需将状态不同的两种硬币中,为偶数的数量的那一堆翻转即可,此时两堆硬币已经达到了同上或是同下,这时,多出来的翻转次数,只需对一个硬币来回翻转,因为是偶数次,所以不影响最后状态。
假设 n 个硬币,1 个向上,n-1 个向下。如前所述,这时需要 n-1 次翻转,此为满足所有情况的最小值。
1 #include<iostream> 2 using namespace std; 3 int n; 4 int main() { 5 cin>>n; 6 while (n!=0) { 7 if (n%2==0) cout<<"No Solution!"<<endl; 8 else cout<<n-1<<endl; 9 cin>>n; 10 } 11 return 0; 12 }
题号:3589 Number-guessing Game
题意:比较 2 个 4 位数,求数值和位置都正确的数字数量以及数值正确但位置不正确的数量
1 #include<iostream> 2 using namespace std; 3 int n,ta[10],tb[10],ansa,ansb; 4 char a[4],b[4]; 5 6 int main() { 7 cin>>n; 8 for (int i=1;i<=n;i++) { 9 for (int j=0;j<=9;j++) ta[j]=0; 10 for (int j=0;j<4;j++) cin>>a[j]; 11 for (int j=0;j<4;j++) ta[a[j]-48]++; 12 13 for (int j=0;j<=9;j++) tb[j]=0; 14 for (int j=0;j<4;j++) cin>>b[j]; 15 for (int j=0;j<4;j++) tb[b[j]-48]++; 16 17 ansa=ansb=0; 18 for (int j=0;j<4;j++) 19 if (a[j]==b[j]) ansa++; 20 21 for (int j=0;j<=9;j++) 22 if (ta[j]<tb[j]) ansb+=ta[j]; 23 else ansb+=tb[j]; 24 ansb-=ansa; 25 26 cout<<ansa<<'A'<<ansb<<'B'<<endl; 27 } 28 return 0; 29 }
题号:3673 Cow Multiplication
题意:请你按下面的公式计算二个数的积:123*45=1*4+1*5+2*4+2*5+3*4+3*5=54
PS:123*45=1*4+1*5+2*4+2*5+3*4+3*5=(1+2+3)*4+(1+2+3)*5=(1+2+3)*(4+5)
1 #include<iostream> 2 using namespace std; 3 int a,b,ha,hb; 4 int main(){ 5 cin>>a>>b; 6 while(a>0) { 7 ha+=a%10; 8 a/=10; 9 } 10 while(b>0) { 11 hb+=b%10; 12 b/=10; 13 } 14 cout<<ha*hb; 15 return 0; 16 }
题号:3913 Gnome Sequencing
题意:给你三个小矮人的胡须长度,判断这三个数是否是有序的(升序或降序)
1 #include<iostream> 2 using namespace std; 3 int n,a,b,c; 4 int main() { 5 cin>>n; 6 cout<<"Gnomes:"<<endl; 7 for (int i=1;i<=n;i++) { 8 cin>>a>>b>>c; 9 if (a>b && b>c || a<b && b<c) cout<<"Ordered"<<endl; 10 else cout<<"Unordered"<<endl; 11 } 12 return 0; 13 }
题号:3980 取模运算
题意:编写取模函数
PS:不能用 % 噢
1 #include<iostream> 2 using namespace std; 3 int a,b; 4 int main(){ 5 while(cin >> a >> b) { 6 cout << a - a / b * b << endl; 7 } 8 return 0; 9 }