The 14th Zhejiang Provincial Collegiate Programming Contest
比賽連結:
https://vjudge.csgrandeur.cn/contest/160686
A - Cooking Competition
題目大意:
\(Kobayashi\) 和 \(Tohru\) 比賽,比 \(n\) 輪,輸入 \(n\) 個數,如果是 1,該輪 \(Kobayashi\) + 1 分,如果是 2 \(Tohru\) + 1 分,如果是 3 兩個人都 + 1,如果是 4,兩個人都 -1。判斷誰最後獲勝,若平局,輸出 \(Draw\)。
思路:
按題意模擬。
程式碼:
#include <bits/stdc++.h> using namespace std; int n, a, T = 1; void solve(){ cin >> n; int p = 0, q = 0; for (int i = 1; i <= n; i ++ ){ cin >> a; if (a == 1) p++; else if (a == 2) q++; } if (p > q) cout << "Kobayashi\n"; else if (p < q) cout << "Tohru\n"; else cout << "Draw\n"; } int main(){ cin >> T; while (T--) solve(); return 0; }
B - Problem Preparation
題目大意:
省賽要出題,現在出題人出了 \(n\) 道題,每道題的難度為 \(a_i\),這套題要滿足一下四個條件。
1、題目的數量要在 10 道到 13 道左右。
2、最簡單的一道題的難度要為 1
3、難度為 1 的題目至少有兩道
4、除了最難的一道題,任意兩道題之間的難度差距不超過 2
思路:
對 \(a\) 陣列排序,然後依次是否符合條件即可。
程式碼:
#include <bits/stdc++.h> using namespace std; int T = 1, n; void solve(){ cin >> n; vector <int> a(n); for (int i = 0; i < n; i ++ ) cin >> a[i]; sort(a.begin(), a.end()); if (n < 10 || n > 13 || a[0] != 1 || a[1] != 1) cout << "No\n"; else{ for(int i = 2; i < n - 1; i ++ ) if (a[i - 1] + 2 < a[i]){ cout << "No\n"; return; } cout << "Yes\n"; } } int main(){ ios::sync_with_stdio(false);cin.tie(0); cin >> T; while (T--) solve(); return 0; }
C - What Kind of Friends Are You?
題目大意:
動物園裡面有 \(c\) 個動物,現在要去分辨其中 \(n\) 種動物分別是什麼動物,問每個動物相同的 \(q\) 個問題,每個問題由 \(m\) 個動物集合組成,若動物回答 \(yes\),說明它是其中的一個動物,若回答 \(no\),說明它不在這個集合中,接下來有一個 \(n * q\) 的矩陣,若為 0,表示動物回答的是 \(no\),若為 1,則表示 \(yes\)。判斷每個動物分別是什麼。
思路:
看到問題的資料範圍是小於 21 的,可以想到二進位制,將每個動物以二進位制的方式表示,若動物存在這個問題的集合中,則它的值加上該問題對應的二進位制值。
問問題的時候找等於該值的動物的數量,若為 1,說明就是該動物,若不為 1,則說明判斷不了。
\(ps\)
程式碼:
#include <bits/stdc++.h>
using namespace std;
int T = 1, n, q, c, m, a;
void solve(){
cin >> n >> q >> c;
vector <string> name(c);
map <string, int> cnt;
for (int i = 0; i < c; i ++ )
cin >> name[i];
for (int i = 0; i < q; i ++ ){
cin >> m;
for (int j = 0; j < m; j ++ ){
string s;
cin >> s;
cnt[s] += (int)pow(2, i);
}
}
for (int i = 0; i < n; i ++ ){
int k = 0, num = 0;
string ans = "";
for (int j = 0; j < q; j ++ ){
cin >> a;
k += a * (int)pow(2, j);
}
for (auto x : name)
if (cnt[x] == k){
num++;
ans = x;
}
if (num == 1) cout << ans << "\n";
else cout << "Let's go to the library!!\n";
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin >> T;
while (T--)
solve();
return 0;
}
D - Let's Chat
題目大意:
若兩個人連續互相發訊息 \(m\) 天,那麼親密度就會 + 1。現在已知 \(n\) 天兩個人互發訊息的記錄,問兩人的親密度會增加多少。
輸入 \(x\) 和 \(y\)。接下來 \(x\) 行每行兩個數,\(l\) 和 \(r\),表示在 \(l\) 到 \(r\) 天中 \(a\) 都給 \(b\) 發了訊息,後面 \(y\) 行表示在 \(l\) 到 \(r\) 天中 \(b\) 給 \(a\) 發了訊息。
思路:
暴力列舉每一個區間進行匹配,重複的那幾天就是兩人互發訊息的時間,兩人連續互發發訊息的天數 - \(m\) + 1 就是親密度的增加值。
程式碼:
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int T = 1, n, m, x, y;
struct node{
int l, r;
}a[N], b[N];
void solve(){
cin >> n >> m >> x >> y;
for (int i = 0; i < x; i ++ )
cin >> a[i].l >> a[i].r;
for (int i = 0; i < y; i ++ )
cin >> b[i].l >> b[i].r;
int ans = 0;
for (int i = 0; i < x; i ++ )
for (int j = 0; j < y; j ++ ){
int p = max(a[i].l, b[j].l), q = min(a[i].r, b[j].r);
if(q - p + 1 >= m)
ans += q - p - m + 2;
}
cout << ans << "\n";
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin >> T;
while (T --)
solve();
return 0;
}