1. 程式人生 > >Codeforces 841A 841B題解

Codeforces 841A 841B題解

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>
 3
#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 }
A

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題解