歷屆第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])