A
贪心的考虑拆成两个满足题意 所以只需判断首尾是否相同即可
# include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int t;
cin>>t;
while(t--)
{
string s;
int n;
cin>>n>>s;
if(s[0]==s[n-1])
cout<<"NO";
else cout<<"YES";
cout<<endl;
}
}
B
考察简单博弈 其实就是让两个人互相删掉对方的最大最小值,最后剩下的其实就是中值。小乌龟最大化值每次操作最大值并不断替换。小猪同理
# include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int v[N];
signed main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>v[i];
}
sort(v+1,v+n+1);
cout<<v[n/2+1];
cout<<endl;
}
return 0;
}
C
题目要求我们区间里不同的数尽可能的多,也就是不同字母之间的距离尽可能的长 用map存储后每次升序输出一边直至完全输出完
# include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=30;
int ma[N];
signed main()
{
int T;
//cout<<char(1);
cin>>T;
while(T--)
{
int n;
string s;
int ans=0;
cin>>n>>s;
for(int i=0;i<s.size();i++)
{
ma[s[i]-'a'+1]++;
ans++;
}
while(ans)
{
for(int i=1;i<=26;i++)
{
if(ma[i])
{
cout<<char('a'+i-1);
ma[i]--,ans--;
}
}
}
cout<<endl;
}
}
D1
不难发现一个性质,假设一个序列最小未出现的非负整数为mex1,第二小未出现的非负整数为mex2,那么只要这个数不是mex1做一次运算的结果就是mex1,做两次运算的结果就是mex2。每个序列最大能得到的只能是到mex2。
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
#define N 200005
int T,n,m,l[N],mx,p[N];
long long ans;
struct Node
{
int v1,v2;
}a[N];
int main()
{
scanf("%d",&T);
while (T --)
{
scanf("%d%d",&n,&m),mx = 0;
for (int i = 1;i <= n;++ i)
{
map<int, int> vis;
scanf("%d",&l[i]);
for (int j = 1,x;j <= l[i];++ j)
scanf("%d",&x),vis[x] = 1;
int now = 0;
for (int j = 0;j <= l[i] + 2;++ j)
{
if(now >= 2) break;
if(!vis[j])
{
if(!now) a[i].v1 = j;
else a[i].v2 = j;
++ now;
}
}
mx = max(mx,a[i].v2);
}
if(m > mx) ans = 1ll * (mx + 1 + m) * (m - mx) / 2ll;
else ans = 0ll;
ans += 1ll * min(m + 1,mx + 1) * mx;
printf("%lld\n",ans);
}
return 0;
}