Codeforces Round #753 (Div. 3)D题
题意:
蓝颜色对应的数字可减,红颜色对应的数字可加,问是否可以变成1~n的数字,每个数字有且仅有出现一次。(对每个数字可处理0次或多次)
分析:
我的思路是将红的放在一起,蓝的放在一起,只要红色有一个大于n,或有两个以上等于n的都为NO,蓝色同理。当时知道可能会少情况,但也没想不出来,下次还是要多举些例子后再提交。
题解的逻辑、思路很清晰、巧妙
看代码就理解了:
//AC代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;
while(t--)
{
int n;cin>>n;
vector<int> v(n),b,r;
for(int i=0;i<n;i++) cin>>v[i];
string s;cin>>s;
for(int i=0;i<n;i++)
{
if(s[i]=='B') b.push_back(v[i]);
else r.push_back(v[i]);
}
sort(b.begin(), b.end());
sort(r.begin(), r.end());
int chk=1,m=1;
for(int i=0;i<b.size();i++,m++) if(b[i]<m) chk=0;
for(int i=0;i<r.size();i++,m++) if(r[i]>m) chk=0;
if(chk) cout<<"YES\n";
else cout<<"NO\n";
}
}