牛客多校(2020第三场)A Clam and Fish

题目链接:https://ac.nowcoder.com/acm/contest/5668/A

题意:

  • 小月有n个单位时间都在钓鱼,每个单位时间有4种状态,有蛤蜊/没蛤蜊,有鱼/没鱼。小月事先知道这n个时间点的状态。每个事件点有四种可能的动作:
  1. 若该时间点有鱼,则可以直钓鱼
  2. 若该时间点有蛤蜊,则可以利用蛤蜊制造一袋鱼饵。
  3. 若该时间点至少有一个鱼饵,则可以利用这个鱼饵钓一条鱼,之后鱼饵数量-1
  4. 什么事都不做
  • 问小月最多可以获得多少条鱼

题解:

  • 平台有鱼就钓鱼
  • 如果有蛤蜊就拿来做鱼饵,没蛤蜊就用鱼饵钓鱼,如果最后还有x包鱼饵,那么就把制作比较晚的x/2包鱼饵的时间拿来钓鱼
 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<string>
 5 using namespace std;
 6 
 7 const int MAX_N = 2 * 10E6 + 1;
 8 int n;
 9 int num_01[MAX_N];
10 string s;
11 
12 void solve() {
13     int sum_fish = 0, sum_food = 0;
14     
15     for (int i = 0; i < n; i++) {
16         switch(s[i]) {
17             case '0': {
18                 if (sum_food != 0) {
19                     sum_food--;
20                     sum_fish++;
21                 }
22                 break;
23             }
24             case '1': {
25                 sum_food++;
26                 break;
27             }
28             case '2':
29             case '3': {
30                 sum_fish++;
31                 break;
32             }
33         }
34     }
35     if (sum_food) {
36         sum_fish += sum_food/2;
37     }
38     cout << sum_fish << "\n";
39     return;
40 }
41 
42 int main() {
43     int t;
44     cin >> t;
45     while (t--) {
46         cin >> n;
47         cin >> s;
48         solve();
49     }
50     return 0;
51 }

附上之前傻傻ac做法

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<string>
 5 using namespace std;
 6 
 7 const int MAX_N = 2 * 10E6 + 1;
 8 int n;
 9 int num_01[MAX_N];
10 string s;
11 
12 void solve() {
13     int sum_fish = 0, sum_food = 0;
14     int num_3 = count(s.begin(), s.end(),'3');
15     int num_2 = count(s.begin(), s.end(),'2');
16     sum_fish = sum_fish + num_2 + num_3;
17     
18     for (int i = 0; i < n; i++) {
19         switch(s[i]) {
20             case '0': {
21                 if (sum_food != 0) {
22                     sum_food--;
23                     sum_fish++;
24                 }
25                 break;
26             }
27             case '1': {
28                 if (sum_food >= num_01[i] - 1 && sum_food != 0) {
29                     sum_fish++;
30                     sum_food--;
31                 }
32                 else {
33                     sum_food++;
34                 }
35                 break;
36             }
37             default : break;
38         }
39     }
40 
41     cout << sum_fish << "\n";
42     return;
43 }
44 
45 int main() {
46     int t;
47     cin >> t;
48     while (t--) {
49         memset(num_01, 0, sizeof(num_01));
50         cin >> n;
51         s = "";
52         cin >> s;
53         num_01[0] = count(s.begin(), s.end(),'0');
54         num_01[0] += count(s.begin(), s.end(), '1');
55         int temp = 1;
56         for (int i = 1; i < n; i++) {
57             if (s[i] == '0' || s[i] == '1') {
58                 num_01[i] = num_01[0] - temp;
59                 temp++;
60             }
61         }
62         solve();
63     }
64     return 0;
65 }
View Code

猜你喜欢

转载自blog.csdn.net/Mrwei_418/article/details/108115553