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