NC201931. 酒馆战棋
描述
输入描述
第一行一个正整数 表示数据组数
对于每组数据:
第一行五个整数,表示你的随从个数,以及对方的普通随从,圣盾随从,嘲讽随从,圣盾嘲讽随从的个数。(因为对方的随从的属性都是无限大,所以剧毒对他来说没有意义)
第二行一个长度为 的 串,第 个字符为 表示从左往右第 个随从是否具有剧毒属性,若有则为 ,否则为 。(因为只需要关心消灭了几个随从,所以嘲讽和圣盾属性无意义)。
保证 ,
输出描述
对于每组数据输出一行两个整数,表示最多消灭几个随从以及最少消灭几个随从。
示例1
输入:
1 5 2 2 2 1 10101
输出:
3 2
C++14(g++5.4) 解法, 执行用时: 8ms, 内存消耗: 496K, 提交时间: 2020-02-01 16:56:54
#include<bits/stdc++.h> using namespace std; int n,a,b,c,d; string s; int mx,mn; void maxx(){ int a1=a,b1=b,c1=c,d1=d; //对方普,单盾,单嘲,盾嘲; for(int i=0;i<n;i++){ if(s[i]=='0'){ if(d1) d1--,c1++; else if(c1); else if(b1) b1--,a1++; } else{ if(c1)mx++,c1--; else if(d1) d1--,c1++; else if(a1) a1--,mx++; else if(b1) b1--,a1++; } } } void minn(){ int a2=a,b2=b,c2=c,d2=d; //对方普,单盾,单嘲,盾嘲; for(int i=0;i<n;i++){ if(s[i]=='1'){ if(d2)d2--,c2++; else if(c2) c2--,mn++; else if(b2) b2--,a2++; else if(a2) a2--,mn++; } else{ if(c2); else if(d2) d2--,c2++; else if(a2) ; else if(b2) b2--,a2++; } } } int main(){ int t; cin>>t; while(t--){ mx=0,mn=0; cin>>n>>a>>b>>c>>d; cin>>s; maxx();minn(); cout<<mx<<" "<<mn<<"\n"; } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 500K, 提交时间: 2020-02-02 15:05:32
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { int t; cin>>t; while(t--) { int n,a,b,c,d; string s; int ans=0; int res=0; cin>>n>>a>>b>>c>>d; cin>>s; int a1=a,b1=b,c1=c,d1=d; for(int i=0;i<n;i++){ if(s[i]=='1') { if(c) ans++,c--; else if(d) d--,c++; else if(a) ans++,a--; else if(b) b--,a++; if(d1) d1--,c1++; else if(c1) c1--,res++; else if(b1) b1--,a1++; else if(a1) res++,a1--; } else { if(d) d--,c++; else if(!c&&b) b--,a++; if(!c1 && d1) d1--,c1++; else if(!c1 && !d1 && !a1) b1--,a1++; } } cout<<ans<<" "<<res<<endl; } return 0; }