A. Domino on Windowsill
题意:
给你一个2×n的板子,其中每面积为2的白色区域可以放置一块白色的多米诺骨牌,黑色同理,问所给的区域是否可以放置足够的对应颜色的多米诺骨牌
思路
算出白色区域和黑色区域所能够放置的最大多米诺骨牌数是否大于所给样例数即可,
其中白色区域所能放置的最大多米诺骨牌数为(k1+k2)/2;
黑色区域所能放置的最大多米诺骨牌数为(2*n-k1-k2)/2。
代码
#include <iostream>
typedef long long ll;
using namespace std;
int main()
{
int kase;
cin >> kase;
ll n,k1,k2;
ll w,b;
while(kase--)
{
cin >> n >> k1 >> k2;
cin >> w >> b;
int flag=0;
ll sum1=k1+k2;
ll sum2=2*n-sum1;
if(sum1/2>=w&&sum2/2>=b)
flag=1;
if(flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
B. Binary Removals
题意
对于一个字符串s(只含有1,0),问是否可以删去多个不相邻的字符,使得原字符串变成非递减字符串
思路
如果出现了两个连续的1时,判断后面是否出现了两个连续的0,若出现则输出NO
其他情况均为YES
代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
int kase;
cin >> kase;
string s;
while(kase--)
{
cin >> s;
int flag1=0,flag2=0,flag=1,flag3=0;
for(int i=0;i<s.size();i++)
{
if(!flag2)
{
if(s[i]=='1'&&!flag1)
flag1=1;
else if(s[i]=='1'&&flag1)
flag2=1;
else if(s[i]=='0')
flag1=0;
}
else
{
if(s[i]=='0'&&!flag3)
flag3=1;
else if(s[i]=='0'&&flag3)
{
flag=0;
break;
}
else if(s[i]=='1')
flag3=0;
}
}
if(flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}