CodeForces Round #499 Div2
A: Stages
題意:
給你n個字符, 現在需要從中選取m個字符,每個字符的花費為在字母表的第幾位,並且如果選了某個字符, 那麽下一個選擇的字符必須要在字母表的2位之後, 假如選了e 那麽 不能選 a-f 可以選擇 g-z, 現在求能滿足條件的最小花費。
題解:
直接模擬。
代碼:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); 4 #define LL long long 5View Code#define ULL unsigned LL 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define max3(a,b,c) max(a,max(b,c)) 12 #define min3(a,b,c) min(a,min(b,c)) 13 typedef pair<int,int> pll; 14 const int inf = 0x3f3f3f3f;15 const LL INF = 0x3f3f3f3f3f3f3f3f; 16 const LL mod = (int)1e9+7; 17 const int N = 1e5 + 10; 18 int cnt[N]; 19 char s[N]; 20 int main(){ 21 int n, m; 22 scanf("%d%d", &n, &m); 23 scanf("%s", s+1); 24 for(int i = 1; i <= n; i++){ 25 cnt[s[i]-‘a‘]++; 26 } 27 intans = 0; 28 for(int i = 0; i < 26 && m; i++){ 29 if(cnt[i]){ 30 m--; 31 ans += i+1; 32 i++; 33 } 34 } 35 if(m) puts("-1"); 36 else printf("%d\n", ans); 37 return 0; 38 }
B:Planning The Expedition
題意:
有n個人要去火星, 現在有m份食物, 每個人在火星生存的時候一天消耗一份食物, 並且每天的消耗的食物必須是同一種類的, 不同的人可以選擇不同種類的食物。 現在求這n個人最多能在火星上待幾天。
題解:
暴力模擬。
代碼:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); 4 #define LL long long 5 #define ULL unsigned LL 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define max3(a,b,c) max(a,max(b,c)) 12 #define min3(a,b,c) min(a,min(b,c)) 13 typedef pair<int,int> pll; 14 const int inf = 0x3f3f3f3f; 15 const LL INF = 0x3f3f3f3f3f3f3f3f; 16 const LL mod = (int)1e9+7; 17 const int N = 1e5 + 10; 18 int cnt[N]; 19 int main(){ 20 int n, m, u; 21 scanf("%d%d", &n, &m); 22 for(int i = 1; i <= m; i++){ 23 scanf("%d", &u); 24 cnt[u]++; 25 } 26 for(int i = m; i >= 1; i--){ 27 int tot = 0; 28 for(int j = 1; j <= 100; j++) 29 tot += cnt[j]/i; 30 if(tot >= n) { 31 printf("%d\n", i); 32 return 0; 33 } 34 } 35 puts("0"); 36 return 0; 37 }View Code
C:Fly
題意:
現在有1-n, n個星球, 現在某個人要按 1 -> 2 -> 3 -> 4 -> ... -> n -> 1的方式走完旅行, 他先再1號星球上起飛, 然後在2號星球降落, 再從2號星球起飛 ... 在n號星球降落,n號星球起飛, 1號星球降落。就完成了旅行。
每個星球有一個起飛系數 ai 有一個降落系數 bi, 每一 ton 燃料 可以帶動 ai / bi 的重量的東西 起飛/降落, 現在他乘著 m ton的火箭, 然後問帶最小多少 ton 的燃料可以完成旅行, 如果完成不了輸出-1;。
題解:
聽說好像是可以倒著模擬, 我覺得也是可以的。
我本人寫的是2分, 2分燃料, 然後每次都check一下, 判斷是否可以, 如果可以就減少燃料上限, 如果不行就增加燃料下限, 最後跑完2分之後在check一下燃料值, 如果可以就輸出答案, 不行就輸出-1。
代碼:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); 4 #define LL long long 5 #define ULL unsigned LL 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define max3(a,b,c) max(a,max(b,c)) 12 #define min3(a,b,c) min(a,min(b,c)) 13 typedef pair<int,int> pll; 14 const int inf = 0x3f3f3f3f; 15 const LL INF = 0x3f3f3f3f3f3f3f3f; 16 const LL mod = (int)1e9+7; 17 const int N = 1e5 + 10; 18 double eps = 1e-8; 19 int a[N], b[N]; 20 int n, m; 21 bool check(double mm){ 22 double weight = mm + m; 23 double need; 24 for(int i = 1; i <= n; i++){ 25 need = (mm+m)/a[i]; 26 if(need > mm) return false; 27 mm -= need; 28 need = (mm+m)/b[i]; 29 if(need > mm) return false; 30 mm -= need; 31 } 32 return true; 33 } 34 int main(){ 35 scanf("%d%d", &n, &m); 36 for(int i = 1; i <= n; i++) 37 scanf("%d", &a[i]); 38 scanf("%d", &b[n]); 39 for(int i = 1; i < n; i++) 40 scanf("%d", &b[i]); 41 double l = 0, r = 2e9, mm ; 42 for(int i = 1; i <= 100; i++){ 43 mm = (l+r) / 2; 44 if(check(mm)) r = mm; 45 else l = mm; 46 } 47 if(check(r)) printf("%.8f", r); 48 else printf("-1"); 49 return 0; 50 }View Code
D:Rocket
交互題
題意:
某個人在地球去火星的路上,這段路程為 m , 現在他想知道有他現在離火星的距離是多少,他可以向火箭猜測現在他與火星的距離是多少,假設實際距離為 x ,現在他猜了y ,如果 y > x 則 火箭會返回 -1,如果 x == y 火箭會返0 , y < x 火箭會返回1 。但是火箭回答程序有一些損壞,有時候會回答出相反的答案, 即正確答案為1 他會返回 -1,0 返回0 ,-1返回1。 但是火箭回答正確與否是有周期的, 周期為n。 現在你最多詢問60次, 要求輸出正確的 x 值是多少。
題解:因為n最多30, 我們可以在第一段周期都輸入0, 如果返回0, 那麽說名實際距離就是0,否則的話, 那麽實際距離一定 > 1, 那麽我們就可以知道回答問題正確和相反是按照哪個周期了。接下來我們2分答案就好了。
註意的就是找到答案的時候要及時退出,並且輸出的時候要換行。
代碼:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); 4 #define LL long long 5 #define ULL unsigned LL 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define max3(a,b,c) max(a,max(b,c)) 12 #define min3(a,b,c) min(a,min(b,c)) 13 typedef pair<int,int> pll; 14 const int inf = 0x3f3f3f3f; 15 const LL INF = 0x3f3f3f3f3f3f3f3f; 16 const LL mod = (int)1e9+7; 17 const int N = 1e5 + 100; 18 int a[N]; 19 int main(){ 20 int m, n; 21 scanf("%d%d", &m, &n); 22 for(int i = 1; i <= n; i++){ 23 printf("1\n"); 24 fflush(stdout); 25 scanf("%d", &a[i]); 26 if(a[i] == 0){ 27 printf("%d\n", 1); 28 exit(0); 29 } 30 } 31 for(int i = 1; i <= n; i++) 32 a[i] *= -1; 33 int cnt = 1; 34 int l = 2, r = m+1, mid; 35 int t; 36 while(1){ 37 mid = l+r >> 1; 38 printf("%d\n", mid); 39 fflush(stdout); 40 scanf("%d", &t); 41 if(t == 0) { 42 printf("%d\n", mid); 43 exit(0); 44 } 45 t *= a[cnt]; 46 cnt++; 47 if(cnt > n) cnt = 1; 48 if(t < 0) l = mid; 49 else r = mid; 50 } 51 return 0; 52 }View Code
E:Border
題意:
某個人去火星旅遊,但是去火星旅遊需要繳入門費,火星上的貨幣是以k進制進行的,並且火星上的人覺得 d 數字是神聖的,如果入門費的最後一位的數字是 d (基於k進制)那麽火星人就會很開心,不幸的是我們不知道火星人覺得哪個數字是神聖的, 現在有 n 種面值為 ai 的貨幣(基於10進制), 每種貨幣都有有無窮個, 現在問在任意組合下, 最後能組合出多少個不同的最後一位的數字, 並且按大小輸出所有的可以組成的數。
題解:
ax + by = z
如果給定a,b,z之後該方程有解, 那麽 z % gcd(a,b) == 0, 所以我們求出所有面值關於k的 gcd 以及 所有面值之間的 gcd, 那麽所有這些gcd倍數的值都可以被表示出來。
代碼:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); 4 #define LL long long 5 #define ULL unsigned LL 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define max3(a,b,c) max(a,max(b,c)) 12 #define min3(a,b,c) min(a,min(b,c)) 13 typedef pair<int,int> pll; 14 const int inf = 0x3f3f3f3f; 15 const LL INF = 0x3f3f3f3f3f3f3f3f; 16 const LL mod = (int)1e9+7; 17 const int N = 1e5 + 100; 18 int a[N]; 19 int vis[N]; 20 int cnt = 0; 21 int main(){ 22 int n, k; 23 scanf("%d%d", &n, &k); 24 int last = k; 25 for(int i = 1; i <= n; i++){ 26 scanf("%d", &a[i]); 27 a[i] %= k; 28 if(a[i]){ 29 last = __gcd(a[i], last); 30 a[i] = __gcd(a[i], k); 31 vis[a[i]] = 1; 32 } 33 else vis[0] = 1; 34 } 35 vis[last] = 1; 36 for(int i = 1; i < k; i++){ 37 if(vis[i]){ 38 cnt++; 39 for(int j = i*2; j <= k; j+=i) 40 vis[j] = 1; 41 } 42 } 43 vis[0] |= vis[k]; 44 if(vis[0]) cnt++; 45 printf("%d\n", cnt); 46 for(int i = 0; i < k; i++){ 47 if(vis[i]) printf("%d ", i); 48 } 49 return 0; 50 }View Code
F:Mars rover
題意:一道模擬門電路的題。題目要求輸出每個信號輸入的位置取反之後最後 1 號位置的值是多少。
題解:先模擬出最開始的型號,並且處理出如果上一個位置的狀態發生改變該位置的信號會不會發生改變,如果會發生改變,就標記一下上一個位置, 最後先dfs完一遍之後,就可以處理出每個位置發生改變之後會不會導致下一個位置的信息發生改變。 我們再從1號節點遍歷一遍, 如果某個位置沒有被標記過, 那麽就清除他所有子節點的標記。
代碼:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); 4 #define LL long long 5 #define ULL unsigned LL 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define max3(a,b,c) max(a,max(b,c)) 12 #define min3(a,b,c) min(a,min(b,c)) 13 typedef pair<int,int> pll; 14 const int inf = 0x3f3f3f3f; 15 const LL INF = 0x3f3f3f3f3f3f3f3f; 16 const LL mod = (int)1e9+7; 17 const int N = 1e6 + 100; 18 int n; 19 int op[N];/// 1 -> & 2 -> ^ 3 -> not 4 -> in 20 int ok[N]; 21 int val[N]; 22 int ans[2]; 23 char s[10]; 24 vector<int> son[N]; 25 void dfs(int u){ 26 if(op[u] == 4) return ; 27 for(int i = 0; i < son[u].size(); i++) dfs(son[u][i]); 28 int x = son[u][0]; 29 if(op[u] == 3){ 30 val[u] = 1 ^ val[x]; 31 ok[x] = 1; 32 } 33 int y = son[u][1]; 34 if(op[u] == 1){ 35 val[u] = val[x] & val[y]; 36 if(val[y] == 1) ok[x] = 1; 37 if(val[x] == 1) ok[y] = 1; 38 } 39 else if(op[u] == 2){ 40 val[u] = val[x] ^ val[y]; 41 ok[x] = ok[y] = 1; 42 } 43 else if(op[u] == 5){ 44 val[u] = val[x] | val[y]; 45 if(val[x] == 1 && val[y] == 0) ok[x] = 1; 46 if(val[x] == 0 && val[y] == 1) ok[y] = 1; 47 if(val[x] == 0 && val[y] == 0) ok[x] = ok[y] = 1; 48 } 49 } 50 void dfs2(int u, int flag){ 51 ok[u] &= flag; 52 for(int i = 0; i < son[u].size(); i++) 53 dfs2(son[u][i], ok[u]); 54 } 55 int main(){ 56 scanf("%d", &n); 57 int u, v; 58 for(int i = 1; i <= n; i++){ 59 scanf("%s", s+1); 60 if(s[1] == ‘I‘) op[i] = 4, scanf("%d", &val[i]); 61 else if(s[1] == ‘N‘){ 62 scanf("%d", &u); 63 son[i].pb(u); 64 op[i] = 3; 65 } 66 else { 67 scanf("%d%d", &u, &v); 68 son[i].pb(u); son[i].pb(v); 69 if(s[1] == ‘A‘) op[i] = 1; 70 if(s[1] == ‘X‘) op[i] = 2; 71 if(s[1] == ‘O‘) op[i] = 5; 72 } 73 } 74 dfs(1); 75 ok[1] = 1; 76 dfs2(1,1); 77 ans[0] = val[1]; ans[1] = val[1] ^ 1; 78 for(int i = 1; i <= n; i++) 79 if(op[i] == 4) printf("%d", ans[ok[i]]); 80 return 0; 81 }View Code
CodeForces Round #499 Div2