建北電資聯合暑訓 暑支暑資誰最電  C++小小賽_題解

最終排名

# PRESENTING CODE

第三名:jellyfish (2AC) 1229 sec

第二名:ianwen (3AC) 2564 sec

第一名:keaucucal (3AC) 1063 sec

第一題

Hello 電神!

  • 先看範例測資
  • 不要讀完題目
  • 其實只要輸出

題目解讀

#include<bits/stdc++.h>
using namespace std;
int main(){
        cout<<"Hello 電神!\n";
}
# PRESENTING CODE

官方程式碼

第二題

甲晴甲毅

  • 判斷範圍

題目解讀

#include <bits/stdc++.h>
using namespace std;
int main(){
	int n;
    cin>>n;
	string people;
    int p;
	cin>>people>>p;
	if(p>n+10){
		cout<<people<<"太低lalalalalalala !\n";
	}else if(p<n-10){
		cout<<people<<"太高lalalalala !\n";
	}else{
		cout<<people<<"太強lalalala !\n";
	}
	cin>>people>>p;
	if(p>n+10){
		cout<<people<<"太低lalalalalalala !\n";
	}else if(p<n-10){
		cout<<people<<"太高lalalalala !\n";
	}else{
		cout<<people<<"太強lalalala !\n";
	}
	cin>>people>>p;
	if(p>n+10){
		cout<<people<<"太低lalalalalalala !\n";
	}else if(p<n-10){
		cout<<people<<"太高lalalalala !\n";
	}else{
		cout<<people<<"太強lalalala !\n";
	}
	cin>>people>>p;
	if(p>n+10){
		cout<<people<<"太低lalalalalalala !\n";
	}else if(p<n-10){
			cout<<people<<"太高lalalalala !\n";
	}else{
		cout<<people<<"太強lalalala !\n";
	}
}
# PRESENTING CODE

官方程式碼

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    string people;
    int p;
    for(int i=0;i<4;i++){
        cin>>people>>p;
	    if(p>n+10){
		    cout<<people<<"太低lalalalalalala !\n";
	    }else if(p<n-10){
		    cout<<people<<"太高lalalalala !\n";
	    }else{
		    cout<<people<<"太強lalalala !\n";
	    }
    }
	
}
# PRESENTING CODE

迴圈解法程式碼

第三題

暑支暑資誰最電

  1. 輸入人數
  2. 宣告陣列(每個人的名子、比的數字)
  3. 輸入並加總所有人比出的數字
  4. 取模(取餘數)算出取到的是第幾個人
  5. 輸出答案

解題邏輯

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    string w[n];
    long long a[n],s=0;
    for(int i=0;i<n;i++){
        cin>>w[i]>>a[i];
                s+=a[i];
    }
    cout<<w[s%n]<<"太電了OrzOrz\n";
}
# PRESENTING CODE

官方程式碼

第四題

99日出局與佑佑的復仇

  • 先看好規則
  • 噁心實作
  • 其實是為了防破台(全AC)啦哈哈
  • 使用多個if else或是switch case來處理每個不同的輸入
  • 開一個died陣列紀錄是否已經死掉了 記得初始化為死掉
  • 開一個暫存的東西紀錄下一個人是誰 記得大於人數要回到0 如果小於0要變回人數-1

題目解讀

#include <bits/stdc++.h>
using namespace std;
int people;
char arr[14]={'A', '1', '2', '3', '4', '5', '6', '7', '8', '9', 't', 'j', 'q', 'k'};
signed main(){
    int turns;cin>>people>>turns;
    int died[(int)1e6]={0}; //儲存每個人是否已經死亡
    int pile=0, next_person=0, direction=1;
        /*
        pile: 目前牌海數值
        next_person: 下一個出牌者
        direction: 目前進行方向(可能被使用4迴轉而轉向號碼小者)
         */
    while(turns--){
        char poker;cin>>poker; //現在被出出來的那張牌
        if(poker=='4'){
            direction*=-1; //轉向 1變-1 -1變1
        }else if(poker=='5'){
            int next;
                        cin>>next; //輸入下一個人
            next_person=next; //把下一個人設定成剛輸入的值
            continue;
        }else if(poker=='j'){
            int orz807; //其實只是跳過 避免進入else 一個分號就夠了 但807 so dian
        }else if(poker=='t'){
            pile-=10; //牌堆減十
        }else if(poker=='q'){
            pile-=20; //牌堆減二十
        }else if(poker=='k'){
            pile=99; //牌堆直接變成99
        }else if(poker=='A'){
            pile=0; //牌堆歸零
        }else{
            pile+=poker-'0';
                        /*
                        其他情況下 便將牌海加上該數字
                        但這邊存的poker變數為字元
                        因此需將字元轉換成數字
                        方式則為 char-'0'
                        詳情請見ascii table
                         */
        }
        if(pile>99){
            died[next_person]=true;
            pile-=(poker-'0');
            cout<<next_person<<"\n";
                        /*
                        如果他出完牌後牌堆爆了
                        就把他設定成死了
                         */
        }
        while(true){
            next_person+=direction;
            next_person=(next_person+people)%people;
            if(!died[next_person]) break;
                        /*
                        往下一個人邁進
                        如果死了 就繼續走
                         */
        }
    }
    for(int i=0; i<people; i++) if(!died[i]) cout<<i<<' ';
}
# PRESENTING CODE

官方程式碼

Made with Slides.com