1. 程式人生 > 實用技巧 >牛客多校(2020第三場)A Clam and Fish

牛客多校(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