POJ解題報告


題號: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM