# 程式能力檢定_2020 ###### tags: `ISU109a` ## 01. 基本I/O ### 輸入類型題目 - 上課講解 1. 讀入 𝑛 筆資料 (知道讀幾個) - Ex: UVA 10041 Vito's family 2. 讀至檔案結束 (不知讀幾個,讀到沒有資料為止) - Ex: UVA 10055 Hashmat the brave warrior 3. 讀至 0 結束 (不知讀幾個,讀到符合條件資料為止) - Ex: UVA 10035 Primary Arithmetic - 練習題目 1. Vito's family (CPE10406, UVA10041) 2. Hashmat the brave warrior (CPE10407, UVA10055) 3. Primary Arithmetic (CPE10404, UVA10035) 4. The 3n + 1 problem (CPE10400, UVA100) 5. You can say 11 (CPE10460, UVA10929) 6. Bangla Numbers (CPE10414, UVA10101) 7. List of Conquests (CPE21924, UVA10420) - Q & A ## 02. 善用暨有資源 ### 利用已有資源 - 上課講解 1. 自己撰寫函數 (字串、口語數字) - Ex: UVA 10101 Bangla Numbers ``` 'C++'= #include <iostream> #include <string> using namespace std; const string s[]={" lakh"," hajar"," shata",""}; void kuti(int d) { int base[] = {100000,1000,100,1}; int mod[] = {100,100,10,100}; int v; for(int i=0; i<4; i++) { v=d/base[i]%mod[i]; if(v!=0) cout<<" "<<v<<s[i]; } } int main() { long long n,a,b,c,base=10000000; int cnt=1; while(cin>>n) { cout<<" "<<cnt++<<"."; a=n/base/base; b=n/base%base; c=n%base; if(a!=0) { kuti(a); cout<<" kuti"; } if((a|b)!=0) { kuti(b); cout<<" kuti"; } if(c!=0) { kuti(c); } if(n==0) cout<<" 0"; cout<<endl; } return 0; } ``` 2. 字串、排序 - Ex: UVA 10420 List of Conguests 3. 迴圈、排序 - Ex: UVA 11321 Sort! Sort!! and Sort!!! ``` 'C++'= #include <iostream> #include <algorithm> using namespace std; struct Num { int n; int r,o; }; bool comp(Num x, Num y) { bool result=true; if(x.r<y.r) result=true; else if(x.r>y.r) result=false; else if(x.o!=y.o) result=(x.o>y.o); else { if(x.o==1) result=(x.n>y.n); else result=(x.n<y.n); } return result; } int main() { Num ad[10000]; int m,n; while((cin>>n>>m) && (m!=0 || n!=0)) { for(int i=0; i<n; i++) { cin>>ad[i].n; ad[i].r = ad[i].n%m; ad[i].o = ad[i].n&0x1; //%2之義 } sort(ad,ad+n,comp); cout<<n<<" "<<m<<endl; for(int i=0; i<n; i++) cout<<ad[i].n<<endl; } cout<<"0 0"<<endl; return 0; } ``` ``` 'c++'= #include <iostream> #include <algorithm> #include <vector> using namespace std; struct Num { int n; int r,o; //r: 除以m餘數, o: 1為奇數, 0為偶數 }; bool comp(Num x, Num y) { bool result=true; if(x.r<y.r) result=true; else if(x.r>y.r) result=false; else if(x.o!=y.o) result=(x.o>y.o); else { if(x.o==1) result=(x.n>y.n); else result=(x.n<y.n); } return result; } int main() { vector<Num> ad; int m,n; Num d; while((cin>>n>>m) && (m!=0 || n!=0)) { ad.clear(); for(int i=0; i<n; i++) { cin>>d.n; d.r = d.n%m; d.o = d.n&0x1; //%2之義 ad.push_back(d); } sort(ad.begin(),ad.end(),comp); cout<<n<<" "<<m<<endl; for(int i=0; i<n; i++) cout<<ad[i].n<<endl; } cout<<"0 0"<<endl; return 0; } ``` ## 03. 一顆星選集 – 字串 * 上課講解 要領: - Count - Table lookup - Type convert - Substring * Count * 8. What's Cryptanalysis? (CPE10402, UVA10008) ```C++= #include <algorithm> #include <iostream> using namespace std; struct ALS { char ch; int cnt; }; bool comp(ALS a, ALS b) { return a.cnt>b.cnt; } int main() { ALS al[26]; int n; char c; for(int i=0; i<26; i++) { al[i].ch='A'+i; al[i].cnt = 0; } cin>>n; while(cin>>c) { if(c>='a' && c<='z') al[c-'a'].cnt++; if(c>='A' && c<='Z') al[c-'A'].cnt++; } stable_sort(al,al+26,comp); for(int i=0; i<26; i++) { if(al[i].cnt!=0) cout<<al[i].ch<<" "<<al[i].cnt<<endl; } return 0; } ``` ```C++= #include<iostream> using namespace std; struct count { int num=0; char a; }; int main(){ int n; string str; cin>>n; n++; count c1[26]; for(int i=0;i<26;i++) { c1[i].a=i+65; } while(n--){ getline(cin,str); for(int i=0;i<str.length();i++) { if(str[i]>96&&str[i]<123) { str[i]-=32; } if(str[i]>64&&str[i]<91) { c1[str[i]-65].num++; } } } int max=0; for(int i=0;i<26;i++) { if(c1[i].num>max) max=c1[i].num; } for(int j=max;j>=1;j--) { for(int i=0;i<26;i++) { if(c1[i].num==j) cout<<c1[i].a<<" "<<c1[i].num<<endl; } } } ``` * Type Convert * 13. TeX Quotes (CPE22131, UVA272) ```C++= #include <bits/stdc++.h> using namespace std; int main(int argc, char** argv) { int n; bool flag=false; string tex; while(getline(cin,tex)) { for(int i=0;i<tex.length();i++) { if(tex[i]==34&&flag==true) { cout<<"''"; flag=false; } else if(tex[i]==34) { cout<<"``"; flag=true; } else cout<<tex[i]; } cout<<endl; } return 0; } ``` * 練習題目 8. What's Cryptanalysis? (CPE10402, UVA10008) 9. Decode the Mad man (CPE10425, UVA10222) 參考解答 ```C++= ``` 11. Problem J: Summing Digits (CPE10473, UVA11332) 12. Common Permutation (CPE10567, UVA10252) 參考解答 ```C++= #include <string> #include <iostream> #include <algorithm> using namespace std; int main() { string a,b,x; int la,lb,ala[26],alb[26],lc; while(cin>>a>>b) { la = a.length(); lb = b.length(); for(int i=0; i<26; i++) ala[i]=alb[i]=0; for(int i=0; i<la; i++) ala[a[i]-'a']++; for(int i=0; i<lb; i++) alb[b[i]-'a']++; for(int i=0; i<26; i++) { lc = min(ala[i],alb[i]); if(lc!=0) for(int j=0; j<lc; j++) cout<<(char)('a'+i); } cout<<endl; } return 0; } ``` 13. Rotating Sentences (CPE21914, UVA490) 14. TeX Quotes (CPE22131, UVA272) * Q & A ## 2020.10.20 CPE 測驗 1. Hartals (UVa10050, 答對人數 827/2180) ```C++= #include <iostream> using namespace std; int main() { int n,d,p,pd[3650],ha,c,t; cin>>n; // #test data for(int i=0; i<n; i++) { cin>>d; //#days for(int j=0; j<d; j++) pd[j]=0; cin>>p; // #parties for(int k=0; k<p; k++) { cin>>ha; for(int j=ha-1; j<d; j+=ha) pd[j]++; } c=0; for(int j=0; j<d; j++) { t=j%7; if(t!=5 && t!=6 && pd[j]!=0) c++; } cout<<c<<endl; } return 0; } ``` 2. The Decoder (UVa00458, 答對人數 980/2180) ```C++= #include <string> #include <iostream> using namespace std; int main() { string s; while(getline(cin,s)) { for(int i=0; i<s.length(); i++) s[i]-=7; cout<<s<<endl; } return 0; } ``` ```C++= #include<iostream> using namespace std; int main() { string a; while(cin>>a){ for(int i=0;i<a.length();i++){ a[i]=a[i]-7; } cout<<a<<endl; } return 0; } //這題剛好可以用cin輸入 ``` 3. Basically Speaking (UVa00389, 答對人數 391/2180) ```C++= #include <string> #include <iostream> using namespace std; int main() { string si,so; int bi,bo,t,i; char d[] = {'0','1','2','3','4','5','6','7', '8','9','A','B','C','D','E','F'}; while(cin>>si>>bi>>bo) { t=0; for(i=0; i<si.length(); i++) { if(si[i]>='0' && si[i]<='9') t= t*bi+(si[i]-'0'); else if(si[i]>='A' && si[i]<='F') t= t*bi+(si[i]-'A'+10); } so = " 0"; i=6; while(t>0 && i>=0) { so[i]=d[t%bo]; t/= bo; i--; } if(t==0) cout<<so<<endl; else cout<<" ERROR"<<endl; } return 0; } ``` 4. Graphical Editor (UVa10267, 答對人數 79/2180) ```C++= ``` 5. Is It A Tree? (UVa00615, 答對人數 69/2180) ```C++= ``` 6. String Theory (UVa01746, 答對人數 2/2180) ```C++= ``` 7. Stamps (UVa00165, 答對人數 21/2180) ```C++= ``` ## 04. 一顆星選集 – 數學計算 * 上課講解 Main topics * Calendar、Set、Probability、 Arithmetic series、Geometric series (日曆 、集合、機率、等差級數、等比級數) * Area、Algebra、Polynomial、 Simultaneous equations、Matrix、Basic physics 面積、代數、多項式、聯立方程式、矩陣、基本物理 * Key Point * Understand the requirement, then design the method, finally write program. (了解題意後,先想出解法再撰寫程式) 1. d097. UVa 10038 - Jolly Jumpers 參考程式 ```C++= #include <iostream> using namespace std; int main() { int i,n,flag,t,d[3001],num[3001]; while(cin>>n) { cin>>num[0]; for(i=1; i<n; i++) { cin>>num[i]; d[i]=0; } flag=1; //flag 0:Not Jolly, 1:Jolly i=1; while(flag==1 && i<n) { t=num[i]-num[i-1]; if(t<0) t=-t; if(t>0 && t<n && d[t]==0) d[t]++; else flag=0; i++; } if(flag==1) cout<<"Jolly"<<endl; else cout<<"Not jolly"<<endl; } return 0; } ``` 2. c022. UVa 10783 - Odd Sum 參考程式 ```C++= #include <iostream> using namespace std; int main() { int n,a,b,sum; cin>>n; for(int i=0; i<n; i++) { cin>>a>>b; sum=0; if(a%2==0) a++; for(int j=a; j<=b; j+=2) sum+=j; cout<<"Case "<<i+1<<": "<<sum<<endl; } return 0; } ``` 3. d186. UVa 11461 - Square Numbers 參考程式 ```C++= #include <iostream> using namespace std; int main() { int a,b,i,cnt; while(cin>>a>>b && (a!=0||b!=0)) { cnt=0; i=1; while(i*i<a) i++; while(i*i<=b) { cnt++; i++; } cout<<cnt<<endl; } return 0; } ``` ```cpp= #include <cmath> #include <iostream> using namespace std; int main() { int a,b,cnt; while(cin>>a>>b && (a!=0||b!=0)) { cnt=floor(sqrt(b))-ceil(sqrt(a))+1; cout<<cnt<<endl; } return 0; } ``` 4. d226. UVa 10071 - Back to High School Physics 參考程式 ```C++= #include <iostream> using namespace std; int main() { int v,t; while(cin>>v>>t) { cout<<2*v*t<<endl; } return 0; } ``` ## 05. 一顆星選集 – 質數、因數、倍數 1. d387. UVa 10235 - Simply Emirp 1. d672. UVa 10922 - 2 the 9s 1. d255. UVa 11417 - GCD 1. a007. 判斷質數 (體驗:使用特別演算法) 採用費馬小定理(Miller-Rabin test) 需自行撰寫模指數運算 ```Cpp= #include <iostream> using namespace std; bool PrimeTest(long); long long modexp(long long, long long, long long); int main() { long aaa; while(cin >> aaa){ if (PrimeTest(aaa)) cout<<"質數"<<endl; else cout<<"非質數"<<endl; } return 0; } bool PrimeTest(long a) { bool isPrime; long t,r[] = {2,3,5,7,11,13,17,19}; int i; for(i=0; i<8; i++) { if(a==r[i]) return true; else if(a%r[i]==0) return false; } i=0; isPrime=true; while(isPrime && i<8) { t=modexp(r[i],a-1,a); if(t!=1) isPrime=false; i++; } return isPrime; } long long modexp(long long a, long long e, long long p) { long long c,d=0x40000000; c=1; while(d!=0) { c=(c*c)%p; if((d&e)!=0) c=(c*a)%p; d>>=1; } return c; } ``` 5. d904. 換零錢 (體驗:動態程式規劃) ```cpp= #include <iostream> using namespace std; int main() { int c,n,coin[10],mco[1001],t; cin>>c>>n; for(int i=0; i<n; i++) cin>>coin[i]; for(int i=0; i<=c; i++) mco[i]=i; for(int i=0; i<n; i++) { for(int j=coin[i]; j<=c; j++) { t=mco[j-coin[i]]+1; if(t<mco[j]) mco[j]=t; } } cout<<mco[c]<<endl; return 0; } ``` DP挑戰題 d133. UVa 00357 - Let Me Count The Ways ```cpp= #include <iostream> using namespace std; int main() { int n,i; int coin[] = {1,5,10,25,50}; long long mco[30001]; for(i=0; i<=30000; i++) mco[i]=1; for(i=1; i<=4; i++) { mco[coin[i]]++; for(int j=coin[i]+1; j<=30000; j++) { mco[j]+= mco[j-coin[i]]; } } while(cin>>n) { if(mco[n]==1) cout<<"There is only "<<mco[n]<<" way to produce "<<n<<" cents change.\n"; else cout<<"There are "<<mco[n]<<" ways to produce "<<n<<" cents change.\n"; } return 0; } ``` ## 06. 一顆星選集 – 排序與中位數 1. e512. UVa 10242 - Fourth Point!! ```C++= #include <iostream> #include <iomanip> using namespace std; int main() { double p[8],x,y; while(cin>>p[0]) { for(int i=1; i<8; i++) cin>>p[i]; if(p[2]==p[4] && p[3]==p[5]) { x = p[0]+p[6]-p[2]; y = p[1]+p[7]-p[3]; } else if(p[2]==p[6] && p[3]==p[7]) { x = p[0]+p[4]-p[2]; y = p[1]+p[5]-p[3]; } else if(p[0]==p[4] && p[1]==p[5]) { x = p[2]+p[6]-p[0]; y = p[3]+p[7]-p[1]; } else if(p[0]==p[6] && p[1]==p[7]) { x = p[2]+p[4]-p[0]; y = p[3]+p[5]-p[1]; } cout<<fixed<<setprecision(3)<<x<<" "<<y<<endl; } return 0; } ``` 3. e606. UVa 10057 - A mid-summer nights dream ```C++= #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n,cnt,pc,min,t,mid; long long sum; vector<int> x,y; while(cin>>n) { x.clear(); for(int i=0; i<n; i++) { cin>>t; x.push_back(t); } sort(x.begin(),x.end()); mid = x[n/2]; cnt = count(x.begin(),x.end(),mid); pc = 1; if(n%2==0 && mid!= x[n/2-1]) { pc = mid-x[n/2-1]+1; mid = x[n/2-1]; cnt+= count(x.begin(),x.end(),mid); } cout<<mid<<" "<<cnt<<" "<<pc<<endl; } return 0; } ``` 5. e561. UVa 00299 - Train Swapping ```C++= #include <vector> #include <algorithm> #include <iostream> using namespace std; int main() { int tn,n,c,a[50]; cin>>tn; for(int m=0; m<tn; m++) { while(cin>>n) { c=0; for(int i=0; i<n; i++) cin>>a[i]; for(int i=1; i<n; i++) { for(int j=0; j<i; j++) if(a[j]>a[i]) c++; } cout<<"Optimal train swapping takes "<<c<<" swaps."<<endl; } } return 0; } ```