2021-3-14网络赛赛克 [神仙爱采药] 贪心+字符串等

Description

 

您是一个神仙,但您很喜欢采药。

您有一个神奇的背包,背包内有VV个格子。

您所在的空间内有一些药,每个药会占用 11 或 22 个格子。

每天可以进行一次如下操作:

采摘一个药材放入背包中,若此时背包中没有多余的格子来放入新的药材,可以先将背包中的若干药材扔出去,至于扔多少以及扔几个,全都由您决定。当然您也可以选择不去进行采摘操作。

每一天结束前,神奇背包中的每个药材都会产生一个药丸。

作为神仙,您知道每天您可以采摘的药材类型(即占用格子数目),注意,当天的药材如果不采摘,在第二天就会消失(当天药材仅限当天采摘)。

为了获得尽可能多的药丸,请您计算最终能获得的药丸数目最多是多少?

 

Input

 

给定一个整数 VV 表示背包的格子数量,接下来一行一个由12构成的字符串 ss 表示药占用体积的情况。

其中1表示该药占用体积为 11,2表示该药占用体积为 22​。

|s|s∣表示天数

 V100000,s100000

 

Output

 

最多的药丸数目。

 

 

 

 

 

题解:

 

解题思路:

 

 

 

注意数据范围会爆int

 

 

 1 #include <iostream>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 long long ans, cnt1, cnt2, V, n;
 6 char s[100010];
 7 
 8 int main()
 9 {
10   
11   cin >> V >> s;
12   n = strlen(s);
13   
14   for(int i= 0; i < n; i++)
15   {
16       if(s[i] == '2'){
17           if(cnt1 + 2 * cnt2 + 2 <= V) cnt2++;
18     }else
19     {
20         //s[i] = 1;
21       if(cnt1 + 2 * cnt2 + 1 <= V) cnt1++;
22       else if(cnt2>0) cnt2 --, cnt1++;
23     }
24     ans += cnt2+cnt1;
25   }
26   
27      cout << ans << endl;
28   
29   return 0;
30 }

 

posted @ 2021-03-14 22:46  Leo-aiolia-bao  阅读(142)  评论(0编辑  收藏  举报