A. In the Dream
我们只要去算上半场得分和下半场与上半场差值得分,然后分别对这两个种情况的大得分对小得分去进行除法,如果结果大于2,那么就说明出现了一个队伍连拿三分的情况,然后输出NO,如果都没有就输出YES
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
double a, b, c, d;
void solve()
{
cin >> a >> b >> c >> d;
double flag1 = 0;
double flag2 = 0;
if (max(a, b) /(min(a,b) +1)> 2)
{
cout << "NO\n";
return;
}
flag1 = c-a;
flag2 = d-b;
if(max(flag1,flag2)/(min(flag1,flag2)+1)>2)
{
cout << "NO\n";
return;
}
cout << "YES\n";
}
signed main()
{
cin >> t;
while(t--)
{
solve();
}
return 0;
}
B. Like the Bitset
我们只要让s[i]=1的位置尽可能的小就能让其区间尽可能的不是最大值,我们可以从1到n先给s[i]=1的赋值,然后再去赋值0的,什么时候会出现-1的情况呢?那肯定事有连续个s[i]=1的次数>=k在一起的情况
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n, k;
string s;
int a[2000005];
void solve()
{
cin >> n >> k;
cin >> s;
int len = 0;
for (int i = 0; i < s.size();i++)
{
if(s[i]=='1')
{
len++;
}
else
{
len = 0;
}
if(len==k)
{
cout << "NO\n";
return;
}
}
int num = 1;
for (int i = 0; i <s.size();i++)
{
if(s[i]=='1')
{
a[i] = num++;
}
}
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '0')
{
a[i] = num++;
}
}
cout << "YES\n";
for (int i = 0; i < s.size();i++)
{
cout << a[i] << " ";
}
cout << "\n";
}
signed main()
{
cin >> t;
while(t--)
{
solve();
}
}
C. Against the Difference
我们对于这题,我们可以用一个pos数组来统计每个数出现了多少次,然后用一个o数组来确定i位置的数,对于a[i]是第几次出现过的,那我们对于状态转移方程就有了
dp[i]=dp[i-1]
如果我们的o[i]>=a[i]的话,那我我们可以考虑一下更新dp[i]的值
dp[i]=max(dp[i].dp[pos[a[i]][o[i]-a[i]-1]+a[i])
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n, k;
string s;
int a[2000005];
void solve()
{
cin >> n >> k;
cin >> s;
int len = 0;
for (int i = 0; i < s.size();i++)
{
if(s[i]=='1')
{
len++;
}
else
{
len = 0;
}
if(len==k)
{
cout << "NO\n";
return;
}
}
int num = 1;
for (int i = 0; i <s.size();i++)
{
if(s[i]=='1')
{
a[i] = num++;
}
}
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '0')
{
a[i] = num++;
}
}
cout << "YES\n";
for (int i = 0; i < s.size();i++)
{
cout << a[i] << " ";
}
cout << "\n";
}
signed main()
{
cin >> t;
while(t--)
{
solve();
}
}