牛客多校(2020第三場)A Clam and Fish
阿新 • • 發佈:2020-08-19
題目連結:https://ac.nowcoder.com/acm/contest/5668/A
題意:
- 小月有n個單位時間都在釣魚,每個單位時間有4種狀態,有蛤蜊/沒蛤蜊,有魚/沒魚。小月事先知道這n個時間點的狀態。每個事件點有四種可能的動作:
- 若該時間點有魚,則可以直釣魚
- 若該時間點有蛤蜊,則可以利用蛤蜊製造一袋魚餌。
- 若該時間點至少有一個魚餌,則可以利用這個魚餌釣一條魚,之後魚餌數量-1
- 什麼事都不做
- 問小月最多可以獲得多少條魚
題解:
- 平臺有魚就釣魚
- 如果有蛤蜊就拿來做魚餌,沒蛤蜊就用魚餌釣魚,如果最後還有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