i信息学奥赛

加入QQ群:1025629106,或关注微信公众号:i信息学奥赛,获取更多学习资源。

导航

POJ解题报告

Posted on 2021-02-24 14:44  shnoip  阅读(660)  评论(0编辑  收藏  举报

题号: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 }
View Code

 

题号: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;
}
View Code

点我看本题视频讲解

 

题号: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 }
View Code

 

题号: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 }
View Code

市八 李明知提供

 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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

华二 沈思贤提供

 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 }
View Code

市八 李明知提供

思路:
考虑有哪些位置中的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 }
View Code

 

题号: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 }
View Code
 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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code
 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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code
 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 }
View Code

 

题号: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 }
View Code


题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

解法二:
市八 李明知提供
题目中说求连续数列且和为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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

打表

 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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

桶排序

 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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code
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 }
View Code

 

题号: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 }
View Code
 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 }
View Code

华二 沈思贤提供
以 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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code

 

题号: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 }
View Code