2021-3-14网络赛赛克 [神仙爱采药] 贪心+字符串等
Description
您是一个神仙,但您很喜欢采药。
您有一个神奇的背包,背包内有VV个格子。
您所在的空间内有一些药,每个药会占用 11 或 22 个格子。
每天可以进行一次如下操作:
采摘一个药材放入背包中,若此时背包中没有多余的格子来放入新的药材,可以先将背包中的若干药材扔出去,至于扔多少以及扔几个,全都由您决定。当然您也可以选择不去进行采摘操作。
每一天结束前,神奇背包中的每个药材都会产生一个药丸。
作为神仙,您知道每天您可以采摘的药材类型(即占用格子数目),注意,当天的药材如果不采摘,在第二天就会消失(当天药材仅限当天采摘)。
为了获得尽可能多的药丸,请您计算最终能获得的药丸数目最多是多少?
Input
给定一个整数 VV 表示背包的格子数量,接下来一行一个由1
或2
构成的字符串 ss 表示药占用体积的情况。
其中1
表示该药占用体积为 11,2
表示该药占用体积为 22。
|s|∣s∣表示天数
V≤100000,∣s∣≤100000
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 }