歷屆第1題

2016年3月

成績指標

提示
std::sort

題解
一個個掃過去維護最高不及格分數和最低及格分數
用std::sort排序資料

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    // 輸入
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n;i++) cin >> a[i];

    // 計算
    int big = -1000;// 最高不及格分數
    int small = 1000;// 最低及格分數
    for (int i = 0; i < n;i++){
        if (a[i]>=60){
            small = min(small, a[i]);
        }else{
            big = max(big, a[i]);
        }
    }

    // 排序
    sort(a.begin(), a.end());

    // 輸出
    for (int i = 0; i < n;i++){
        cout << a[i];
        if (i<n-1) cout << " ";
    }
    cout << "\n";
    if (big==-1000)cout << "best case\n";
    else cout << big << "\n";
    if (small==1000)cout << "worst case\n";
    else cout << small << "\n";
}


Python範例代碼:

#輸入
n = int(input())
a = list(map(int, input().split()))

#計算
big = -1000
small = 1000
for i in range(n):
    if a[i]>=60:
        small = min(small,a[i])
    else:
        big = max(big,a[i])

#排序
a.sort()

#輸出
for i in range(n):
    if i<n-1:
        print(a[i],end=" ")
    else:
        print(a[i])
if big==-1000:
    print("best case")
else:
    print(big)
if small==1000:
    print("worst case")
else:
    print(small)

2016年10月

三角形辨別

提示
std::sort

題解
輸入三個數之後排序
再用if判斷

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    // 輸入
    vector<int> a(3);
    for (int i = 0; i < 3;i++){
        cin >> a[i];
    }

    // 排序
    sort(a.begin(),a.end());

    // 輸出
    for (int i = 0; i < 3;i++){
        cout << a[i];
        if (i<2) cout << " ";
    }
    cout << "\n";
    if (a[0]+a[1]<=a[2]){
        cout << "No\n";
    }else if (a[0]*a[0]+a[1]*a[1]<a[2]*a[2]){
        cout << "Obtuse\n";
    }else if (a[0]*a[0]+a[1]*a[1]==a[2]*a[2]){
        cout << "Right\n";
    }else if (a[0]*a[0]+a[1]*a[1]>a[2]*a[2]){
        cout << "Acute\n";
    }
}


Python範例代碼:

#輸入
a = list(map(int, input().split()))

#排序
a.sort()

#輸出
for i in range(3):
    if i<2:
        print(a[i],end=" ")
    else:
        print(a[i])
if a[0]+a[1]<=a[2]:
    print("No")
elif a[0]*a[0]+a[1]*a[1]<a[2]*a[2]:
    print("Obtuse")
elif a[0]*a[0]+a[1]*a[1]==a[2]*a[2]:
    print("Right")
elif a[0]*a[0]+a[1]*a[1]>a[2]*a[2]:
    print("Acute")

2017年3月

秘密差

提示
std::string

題解
用string輸入
再掃過去
C++小技巧:

數字字元 - '0'

可以得到數字的值


C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    string num;
    cin >> num;
    int n = num.length();
    int a=0,b=0;
    for (int i = 1; i <= n; i++){
        if (i%2==1){
            a+=num[n-i]-'0';// 奇數位數
        }else{
            b+=num[n-i]-'0';// 偶數位數
        }
    }
    cout << abs(a-b) << "\n";
}


Python範例代碼:

num = input()
a = b = 0
n = len(num)
for i in range(1,n+1):
    if i%2==1:
        a+=int(num[n-i])
    else:
        b+=int(num[n-i])
print(abs(a-b))

2017年10月

邏輯運算子

提示
布林運算

題解
窮舉每一種邏輯運算子
並維護是否可能得到指定結果

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int a,b,c;
    cin >> a >> b >> c;
    bool impossible = true;
    if (((a>0)&&(b>0))==c){
        impossible = false;
        cout << "AND\n";
    }
    if (((a>0)||(b>0))==c){
        impossible = false;
        cout << "OR\n";
    }
    if (((a>0)!=(b>0))==c){
        impossible = false;
        cout << "XOR\n";
    }
    if (impossible) cout << "IMPOSSIBLE\n";
}


Python範例代碼:

a,b,c = map(int,input().split())
impossible = True
if ((a>0) and (b>0))==c:
    impossible = False
    print("AND")
if ((a>0) or (b>0))==c:
    impossible = False
    print("OR")
if ((a>0) != (b>0))==c:
    impossible = False
    print("XOR")
if impossible:
    print("IMPOSSIBLE")

2019年6月

籃球比賽

提示

題解
四局分別是多少分不重要,可以輸入的時候就加起來
再算主客隊各贏幾場

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int a1=0,a2=0,b1=0,b2=0,a=0,b=0;
    for (int i= 0; i < 4;i++){
        int x;
        cin >> x;
        a1+=x;
    }
    for (int i= 0; i < 4;i++){
        int x;
        cin >> x;
        b1+=x;
    }
    for (int i= 0; i < 4;i++){
        int x;
        cin >> x;
        a2+=x;
    }
    for (int i= 0; i < 4;i++){
        int x;
        cin >> x;
        b2+=x;
    }
    if (a1>b1) a++;
    else b++;
    if (a2>b2) a++;
    else b++;
    cout << a1 << ":" << b1 << "\n";
    cout << a2 << ":" << b2 << "\n";
    if (a>b) cout << "Win\n";
    if (a<b) cout << "Lose\n";
    if (a==b) cout << "Tie\n";
}


Python範例代碼:

a=0
a1 = sum(map(int,input().split()))
b1 = sum(map(int,input().split()))
a2 = sum(map(int,input().split()))
b2 = sum(map(int,input().split()))
if a1>b1:
    a+=1
if a2>b2:
    a+=1
print(f"{a1}:{b1}")
print(f"{a2}:{b2}")
if a==2:
    print("Win")
if a==1:
    print("Tie")
if a==0:
    print("Lose")

2020年1月

猜拳

提示

題解
照題敘模擬

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    vector<int> better(10,0);// 定義贏過每個拳的拳是甚麼
    better[0] = 5;
    better[2] = 0;
    better[5] = 2;
    int f, n;
    cin >> f >> n;
    vector<int> y(n);
    for (int i = 0;i<n;i++){
        cin >> y[i];
    }
    for (int k = 1;k<=n;k++){
        cout << f << " ";
        if (f == better[y[k-1]]){
            cout << ": Won at round " << k << "\n";
            break;
        }
        if (y[k-1] == better[f]){
            cout << ": Lost at round " << k << "\n";
            break;
        }
        if (k>1&&y[k-1]==y[k-2]) f = better[y[k-1]];
        else f = y[k-1];
        if (k==n) cout << ": Drew at round " << k << "\n";
    }
}


Python範例代碼:

better = [0]*10
better[0] = 5
better[2] = 0
better[5] = 2
f = int(input())
n = int(input())
y = list(map(int,input().split()))
for k in range(1,n+1):
    print(f, end=" ")
    if f == better[y[k-1]]:
        print(f": Won at round {k}")
        break
    if y[k-1] == better[f]:
        print(f": Lost at round {k}")
        break
    if k>1 and y[k-1]==y[k-2]:
        f = better[y[k-1]]
    else:
        f = y[k-1]
    if k==n:
        print(f": Drew at round {k}")

2020年7月

購物車

提示

題解
對每一個顧客,維護購物車裡有幾個商品 a,b

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int a,b,n,ans=0;
    cin >> a >> b >> n;
    for (int i = 0; i < n;i++){
        int ca=0,cb=0;// 購物車裡有幾個商品 a,b
        int x;
        cin >> x;
        while(x!=0){
            if (x==a)ca++;
            if (x==-a)ca--;
            if (x==b)cb++;
            if (x==-b)cb--;
            cin >> x;
        }
        if (ca>0&&cb>0)ans++;
    }
    cout << ans << "\n";
}


Python範例代碼:

a,b = map(int,input().split())
n = int(input())
ans = 0
for i in range(n):
    ca = cb = 0
    for x in map(int,input().split()):
        if x==a:
            ca+=1
        if x==-a:
            ca-=1
        if x==b:
            cb+=1
        if x==-b:
            cb-=1
    if ca>0 and cb>0:
        ans += 1
print(ans)

2020年10月

人力分配

提示
窮舉

題解
窮舉n+1種分配方法
找最好

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int a1,b1,c1,a2,b2,c2,n;
    cin >> a1 >> b1 >> c1 >> a2 >> b2 >> c2 >> n;
    int ans = -100000000;
    for (int i = 0;i<=n;i++){
        int j = n-i;
        ans = max(ans,a1*i*i+b1*i+c1+a2*j*j+b2*j+c2);
    }
    cout << ans << "\n";
}


Python範例代碼:

a1,b1,c1 = map(int,input().split())
a2,b2,c2 = map(int,input().split())
n = int(input())
ans = -100000000
for i in range(n+1):
    j = n-i
    ans = max(ans,a1*i*i+b1*i+c1+a2*j*j+b2*j+c2)
print(ans)

2021年1月

購買力

提示

題解
模擬購買情況

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,d;
    cin >> n >> d;
    int count = 0;
    int cost = 0;
    for(int i = 0;i<n;i++){
        int a,b,c;
        cin >> a >> b >> c;
        int dd = max(a,max(b,c)) - min(a,min(b,c));
        if (dd>=d){
            count++;
            cost += (a+b+c)/3;
        }
    }
    cout << count << " " << cost << "\n";
}


Python範例代碼:

n,d = map(int,input().split())
count = cost = 0
for i in range(n):
    a,b,c = map(int,input().split())
    if max(a,b,c)-min(a,b,c)>=d:
        count += 1
        cost += (a+b+c)// 3
print(count,cost)

2021年9月

七言對聯

提示

題解
照題序做判斷

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<int> arr(14);
    for (int i = 0;i<n;i++){
        for (int j = 0;j<14;j++){
            cin >> arr[j];
        }
        bool a = arr[1]==arr[3] || arr[1]!=arr[5] || arr[8]==arr[10] || arr[8]!=arr[12]; // 違反A
        bool b = arr[6] == 0 || arr[13] == 1; // 違反B
        bool c = arr[1]==arr[8] || arr[3]==arr[10] || arr[5]==arr[12]; // 違反C
        if (a) cout << "A";
        if (b) cout << "B";
        if (c) cout << "C";
        if (!(a || b || c)) cout << "None";
        cout << "\n";
    }
}


Python範例代碼:

n = int(input())
for i in range(n):
    arr = list(map(int, input().split()))+list(map(int, input().split()))
    a = arr[1]==arr[3] or arr[1]!=arr[5] or arr[8]==arr[10] or arr[8]!=arr[12]
    b = arr[6] == 0 or arr[13] == 1
    c = arr[1]==arr[8] or arr[3]==arr[10] or arr[5]==arr[12]
    if a:
        print("A",end="")
    if b:
        print("B",end="")
    if c:
        print("C",end="")
    if not a and not b and not c:
        print("None",end="")
    print("\n",end="")

2021年11月

修補圍籬

提示

題解
直接掃描過去

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<int> h(n);
    for(int i = 0;i<n;i++)cin>>h[i];
    int sum = 0;
    for(int i = 0;i<n;i++){
        if(h[i]==0){
            int a = i==0?10000:h[i-1];
            int b = i==n-1?10000:h[i+1];
            sum+=min(a,b);
        }
    }
    cout << sum << "\n";
}


Python範例代碼:

n = int(input())
h = list(map(int, input().split()))
ans = 0
for i in range(n):
    if h[i] == 0:
        a = 10000 if i==0 else h[i-1]
        b = 10000 if i==n-1 else h[i+1]
        ans += min(a,b)
print(ans)

2022年1月

程式交易

提示
模擬

題解
紀錄前一次交易的價格&是否有股票
硬算

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,d,last,cur,had=0,ans=0;
    cin >> n >> d;
    cin >> cur;
    last = cur;
    had=1;
    n--;
    while(n--){
        cin >> cur;
        if (had){
            if (cur>=last+d){
                had = 0;
                ans+=cur-last;
                last = cur;
            }
        }else{
            if (cur<=last-d){
                had = 1;
                last = cur;
            }
        }
    }
    cout << ans << "\n";
}


Python範例代碼:

n,d = map(int,input().split())
last=10000
had=False
ans=0
for cur in map(int,input().split()):
    if had:
        if cur>=last+d:
            had=False
            ans+=cur-last
            last=cur
    else:
        if cur<=last-d:
            had=True
            last=cur
print(ans)

2022年6月

數字遊戲

提示

題解
紀錄各個數字出現次數同時維護眾數數量,由右往左掃描輸出有哪些數字

C++範例代碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
    vector<int> a(3);
    vector<int> c(10,0);
    for(int i = 0;i<3;i++)cin>>a[i];
    vector<int> ans(1,0);
    for(int i = 0;i<3;i++){
        c[a[i]]++;
        ans[0] = max(ans[0],c[a[i]]);
    }
    for (int i = 9;i>=1;i--){
        if(c[i]) ans.push_back(i);
    }
    for (int i = 0;i<ans.size();i++){
        cout << ans[i];
        if (i<ans.size()-1) cout << " ";
    }
    cout << "\n";
}


Python範例代碼:

a = list(map(int, input().split()))
c = [0]*10
ans = [0]
for i in range(3):
    c[a[i]]+=1;
    ans[0] = max(ans[0],c[a[i]])
for i in range(9,0,-1):
    if c[i]>0:
        ans.append(i)
for i in range(len(ans)):
    if i<len(ans)-1:
        print(ans[i],end = " ")
    else:
        print(ans[i])