---
# System prepended metadata

title: 選修

---

==(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期末考==

班上太多人確診，被學校禁止上跨班的選修課，所以就沒考期末考了

==心得==

回顧一整個學期，不知不覺間已經學了很多程式設計概念，從函式到字串再到演算法，以前根本想像不到我能了解這些，有以前的基礎加上老師每題都講的很詳細，課程內的東西不會到特別特別難，但自己寫新題目就是另一回事了，能寫出來的機率很低，真的每次都要試驗很多次才有一點點機會成功。