==(1) 2/6前測== 題目: A168 禮品採購 下面的程式不完全正確(我測驗時寫的),有一段時間沒寫程式了,變得很生疏,題目也沒有完全理解到位,希望之後能把感覺找回來。 ``` #include <iostream> #include <cmath> using namespace std; int main(){ int n,N,d,D,A,B,C,j,i; int s[3]; while(cin>>n>>d){ for(int j=1;j>4;j++){ cin>>s[j]; } N=D=0; for(int i=0;i>n;i++){ A=i[1]-i[2]; B=i[2]-i[3]; C=i[3]-i[1]; if(abs(A)>d ||abs(B)>d || abs(C)>d){ N=N+1; D=D+(a+b+c)/3; } } cout<<N<<" "<<D; } } ``` ==(2) 2/23複習== 檢討上週題目,複習基本概念 ``` #include <iostream> using namespace std; int main(){ int n,d; int N=0,D=0;//輸出N是總數D是總價 while(cin>>n>>d){ for(int i=0;i<n;i++){//處理n次3季價格 int max=-1,min=101,sum=0; int p,a; for(int j=0;j<3;j++){//找出最大最小 cin>>p; if(p>max) max=p; if(p<min) min=p; sum=sum+p;//統計價格等等要算平均 } a=sum/3; if((max-min)>=d){//最終比較和統計 N=N+1; D=D+a; } } cout<<N<<" "<<D; } } ``` ==(3)3/2函式== 題目: c039 The 3n+1 problem 我今天請公假沒上到課。這題研究了有一段時間,本來看著答案一直看不懂,後來乾脆把答案關掉自己重寫一次,過程中突然就理解答案在寫什麼了 ``` #include <iostream> using namespace std; int cl(int n){ int length=1; while(n != 1){ if(n%2 == 1) n = 3*n+1; else n = n/2; length++; } return length; } int main(){ int i,j; while(cin>>i>>j){ cout<<i<<" "<<j; int max=-1; if(i <= j){ for(int a=i ; a<=j ; a++){ int A=cl(a); if(A>max) max=A; } } else{ for(int a=j ; a<=i ; a++){ int A=cl(a); if(A>max) max=A; } } cout<<" "<<max<<endl; } } ``` ==(4)3/9遞迴函式== 題目: A157 費波那契數列 ``` #include<iostream> using namespace std; int fib(int n){ if(n==0) return 0; else if(n==1) return 1; else if(n>=2) return fib(n-1)+fib(n-2); } int main(){ int n; while(cin>>n){ cout<<fib(n)<<endl; } } ``` 題目: A158 F91 ``` #include<iostream> using namespace std; int f91(int n){ if(n<=100) return f91(f91(n+11)); else if(n>=101) return n-10; } int main(){ int n; while(cin>>n && n!=0){ cout<<"f91("<<n<<") = "<<f91(n)<<endl; } return 0; } ``` ==(5)3/16指標== 題目: A147 促銷活動 ``` #include <iostream> using namespace std; void discount(double *p1, double *p2){ if(*p1==*p2){ *p2=*p2/2; } } int main(){ double p1, p2; cout << "Original price:" << endl; cin >> p1 >> p2; discount(&p1,&p2); cout << "Price after discount:" << endl; cout << p1 << " " << p2 << endl; return 0; } ``` ==(6)3/23二維陣列== 老師在線上幫我們上課,是不一樣的感覺 題目: a015 矩陣的翻轉 ``` #include<iostream> using namespace std; int main(){ int a,b; while(cin>>a>>b){ int A[100][100]; for(int i=0;i<a;i++){ for(int j=0;j<b;j++) cin>>A[i][j]; } for(int i=0;i<b;i++){ for(int j=0;j<a;j++) cout<<A[j][i]<<" "; cout<<endl; } } } ``` ==(8)4/6字串== 題目: A065 秘密差 ``` #include<iostream> #include<cmath> using namespace std; int main(){ string x; while(cin>>x){ int A=0,B=0; for(int i=0 ; i<x.length() ; i++){ if(i%2==0) A=A+(x[i]-'0'); else B=B+(x[i]-'0'); } cout<<abs(A-B)<<endl; } } ``` ==(9)4/13期中考== 老師有說會從教過的題目出,我有花時間複習,成功獲得100分 ==(10)4/20字串== 題目: a009 解碼器 ``` #include<iostream> #include<cmath> using namespace std; int main(){ string x; while(getline(cin,x)){ for(int i=0 ; i<x.length() ; i++){ x[i]=x[i]-7; } cout<<x; } } ``` 題目: A067 ROT13 ``` #include<iostream> using namespace std; int main(){ string x; while(getline(cin,x)){ for(int i=0 ; i<x.length() ; i++){ if(x[i]>='A'&&x[i]<='Z') cout<<char(((x[i]-'A')+13)%26+'A'); else if(x[i]>='a'&&x[i]<='z') cout<<char(((x[i]-'a')+13)%26+'a'); else cout<<x[i]; } cout<<endl; } } ``` 題目: d086 態度之重要的證明 ``` #include<iostream> using namespace std; int main(){ string x; while(cin>>x && x!="0"){ int sum=0; for(int i=0 ; i<x.length() ; i++){ if(x[i]>='A'&&x[i]<='Z') sum=sum+(x[i]-'A'+1); else if(x[i]>='a'&&x[i]<='z') sum=sum=sum+(x[i]-'a'+1); else{ sum=-1; break; } } if(sum==-1) cout<<"Fail"<<endl; else cout<<sum<<endl; } } ``` ==(11)4/27結構== 題目: A150 多邊形面積 ``` #include<iostream> #include<cmath> #include<iomanip>//取小數 using namespace std; struct point{ float x,y; }; int main(){ int n; while(cin>>n){ point p[n+1]; for (int i=0; i<n; i++) cin>>p[i].x>>p[i].y; p[n]=p[0]; float a=0.0; for (int i=0; i<n; i++) a=a+(p[i].x * p[i+1].y - p[i+1].x * p[i].y); //公式 cout<<setprecision(2)<<fixed<<fabs(a)/2.0; //公式:要除二 } } ``` ==(11)5/4堆疊== 題目: A151 後序式求值 這題有點難,要先知道後序式 ``` #include<iostream> #include<stack> using namespace std; int main(){ stack<int>s; string x; while(cin>>x){ while(!s.empty()) s.pop(); for(int i=0 ; i<x.length() ; i++){ if(x[i]>='0' && x[i]<='9') s.push(x[i]-'0'); else{ int b=s.top(); s.pop(); int a=s.top(); s.pop(); if(x[i]=='+') s.push(a+b); else if(x[i]=='-') s.push(a-b); else if(x[i]=='*') s.push(a*b); else if(x[i]=='/') s.push(a/b); else if(x[i]=='%') s.push(a%b); } } cout<<s.top()<<endl; } } ``` ==(12)5/11堆疊== 題目: A119 括號 ``` #include<iostream> #include<stack> using namespace std; int main(){ stack<int>s; string x; int n=0; while(cin>>x){ for(int i=0 ; i<x.length() ; i++){ if(x[i]=='(') s.push(x[i]); else{ if(!s.empty()){ s.pop(); n++; } else s.push(x[i]); } } if(!s.empty()) cout<<0; else cout<<n; } } ``` ==(13)5/18佇列== 題目: e447 佇列練習 ``` #include<iostream> #include<queue> using namespace std; int main(){ queue<int> q; int n,k,x; while(cin>>n){ while(!q.empty()){ q.pop(); } for(int i=0;i<n;i++){ cin>>k; if(k==1){ cin>>x; q.push(x); } else if(k==2){ if(!q.empty()) cout<<q.front()<<endl; else cout<<"-1"<<endl; } else if(k==3) if(!q.empty()) q.pop(); } } } ``` 題目: 約瑟夫問題 這題我自己寫出來了! ``` #include<iostream> #include<queue> using namespace std; int main(){ queue<int> q; int m,n,a; while(cin>>n>>m){ while(!q.empty()){ q.pop(); } for(int i=1;i<n+1;i++){ q.push(i); } while(q.size()>1){ for(int i=0;i<m-1;i++){ a=q.front(); q.pop(); q.push(a); } q.pop(); } cout<<q.front(); } } ``` ==(14)5/25排序== 題目: d583 企鵝 ``` #include<iostream> #include<algorithm> using namespace std; int main(){ int n; int A[100000]; while(cin>>n){ for(int i=0;i<n;i++) cin>>A[i]; sort(A,A+n);//這裡要記一下寫法 for(int i=0;i<n;i++) cout<<A[i]<<" "; cout<<endl; } } ``` 題目: d190 年齡 ``` #include<iostream> #include<algorithm> using namespace std; int main(){ int n; int A[2000000];//電腦的陣列不能開到這麼大,但網站可以 while(cin>>n && n!=0){ for(int i=0;i<n;i++) cin>>A[i]; sort(A,A+n); for(int i=0;i<n;i++) cout<<A[i]<<" "; cout<<endl; } } ``` ==(15)6/1搜尋== 題目: A152 二分搜尋 有點複雜,我看著書寫的話沒問題,直接來要記很多東西 ``` #include<iostream> using namespace std; int main(){ int n,key; int A[10000]; while(cin>>n){ for(int i=0;i<n;i++) cin>>A[i]; cin>>key; int L=0,R=n-1,M; int count=0,pos=-1;//c是次數,p是位置 while(L<=R){ M=(L+R)/2; count++; if(A[M]==key){ pos=M; break; } else if(A[M]<key) L=M+1; else if(A[M]>key) R=M-1; } if(pos==-1) cout<<"not found "<<count<<endl; else cout<<pos<<" "<<count<<endl; } } ``` ==(15)6/8貪婪法== 題目: A091 加總的代價 ``` #include <iostream> #include <queue> using namespace std; int main(){ priority_queue<int, vector<int>, greater<int>> pq; int n; while(cin>>n && n!=0){ while(!pq.empty()) pq.pop(); int m; for(int i=0;i<n;i++){ cin>>m; pq.push(m); } long long int x,y,cost,total=0; while(pq.size()>1){ x=pq.top(); pq.pop(); y=pq.top(); pq.pop(); cost=x+y; pq.push(cost); total=total+cost; } cout<<total<<endl; } } ``` ==(16)6/15期末考== 班上太多人確診,被學校禁止上跨班的選修課,所以就沒考期末考了 ==心得== 回顧一整個學期,不知不覺間已經學了很多程式設計概念,從函式到字串再到演算法,以前根本想像不到我能了解這些,有以前的基礎加上老師每題都講的很詳細,課程內的東西不會到特別特別難,但自己寫新題目就是另一回事了,能寫出來的機率很低,真的每次都要試驗很多次才有一點點機會成功。