• 牛客多校(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 << "
    ";
    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 << "
    ";
    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
  • 相关阅读:
    time模块
    collection模块
    re模块
    HTML
    Java数据结构之快速排序
    Java数据结构之循环链表(与单链表比较)
    Java数据结构之单链表
    Java数据结构之队列
    Java数据结构之栈
    java数据结构之数组
  • 原文地址:https://www.cnblogs.com/mr-wei977955490/p/15367564.html
Copyright © 2020-2023  润新知