Codeforces 841A 841B題解
阿新 • • 發佈:2017-08-19
c代碼 char ret getchar line 分配 配方 end str
此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。
A. Generous Kefa B. Godsend
兩道水題...
A - 題目大意:把n個字母分配給k個人,如果一個人得到了兩個或兩個以上的相同字母,就會不開心,否則會開心(沒有分配到字母也算開心)。請問能否找到一個合理的分配方案,使得每一個人都開心。如果能,輸出YES,否則輸出NO。
分析:
抽屜原理。如果任意一種字母的出現次數大於k,輸出NO,否則輸出YES。
AC代碼:
1 #include<cstdio> 2 #include<algorithm> 3A#include<cmath> 4 #include<cstring> 5 6 inline void read(int &x) 7 { 8 char ch = getchar(),c = ch;x = 0; 9 while(ch > ‘9‘ || ch < ‘0‘) c = ch,ch = getchar(); 10 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar();11 if(c == ‘-‘) x = -x; 12 } 13 14 int num[30]; 15 16 int main() 17 { 18 int n,k; 19 read(n),read(k); 20 char x = getchar(); 21 for(int i = 1;i <= n;++ i) 22 { 23 while(x < ‘a‘) 24 x = getchar(); 25 num[x-‘a‘+1] ++; 26 x = getchar();27 } 28 int mx = 0; 29 for(int i = 1;i <= 26;++ i) 30 if(num[i] > mx) mx = num[i]; 31 if(mx > k) printf("NO\n"); 32 else printf("YES\n"); 33 return 0; 34 }
B - 題目大意:兩個人玩遊戲,給出一段有n個數字的序列,第一個人First每次可以選取一段和為奇數的區間,將其刪去;第二個人Second每次可以選取一段和為偶數的區間,將其刪去。刪除操作執行完畢之後,序列的剩余兩部分會自動向中間接起來。每個人都會按照最優策略進行遊戲,問最後誰能贏,輸出First或Second。
分析:
經過一系列推算可以發現,Second贏的情況只有一種,即序列中沒有奇數的情況(可憐的Second)。
其他情況。序列中有奇數個奇數或偶數個奇數,都是First贏。
AC代碼:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 6 const int MAXN = 1000005; 7 8 inline void read(int &x) 9 { 10 char ch = getchar(),c = ch;x = 0; 11 while(ch > ‘9‘ || ch < ‘0‘) c = ch,ch = getchar(); 12 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar(); 13 if(c == ‘-‘) x = -x; 14 } 15 16 //FIRST:奇數 SECOND:偶數 17 18 int main() 19 { 20 int n,x,sum = 0; 21 read(n); 22 for(int i = 1;i <= n;++ i) 23 { 24 read(x); 25 if(x%2 == 1) 26 sum ++; 27 } 28 if(sum == 0) 29 printf("Second\n"); 30 else 31 printf("First\n"); 32 return 0; 33 }B
Codeforces 841A 841B題解