题目大意:给你一个序列a,其中只含0 1 2 3,当$a_i=0$的时候表示,此时没有鱼也没有蛤。当$a_i=1$的时候表示此时没有鱼,只有一个蛤,$a_i=2$的时候表示只有一条鱼,没有蛤,当$a_i=3$的时候表示此时既有鱼也有蛤。每个时刻你可以选择一下一种状态行动:1.当此时有蛤的时候,你可以将其拿来制作鱼饵,你的鱼饵+1,2.当此时有鱼的时候,你可以抓到一条鱼不耗费任何东西,3.当你有鱼饵的时候,即使选择没有鱼你也可以抓到鱼,鱼饵-1,4.你此时什么都没做。
输入
2 4 0103 1 1
输出
2 0
emmm,最开始想到的可能就是有鱼抓鱼,有蛤就做鱼饵,但如果直接这么来一遍循环的话。。。如果全是蛤就说明了一直在做鱼饵了吗?显然不太对。所以我们从后面开始遍历,来一个借鱼饵的操作。如果有鱼的话抓鱼,没什么好说的,如果什么都没有的话,我们直接当做现在有鱼饵,然后鱼饵-1,鱼+1,当此时有蛤的话,我们判断此时的鱼饵数量是负的还是不是,如果是负的话,我们就在此时制作鱼饵,否则的话我们继续云抓鱼。最后如果鱼饵的数量是负数的话我们将最终的鱼的数量加加上去就好了
以下是AC代码:
#include <bits/stdc++.h> using namespace std; const int mac=2e6+10; char s[mac]; int main(int argc, char const *argv[]) { int t,n; scanf ("%d",&t); while (t--){ scanf ("%d",&n); scanf ("%s",s+1); int ha=0,fish=0; for (int i=n; i>=1; i--){ if (s[i]=='2' || s[i]=='3') fish++; else if (s[i]=='0') ha--,fish++; else { if (ha<0) ha++; else fish++,ha--; } } if (ha<0) fish+=ha; printf("%d ",fish); } return 0; }