A. Recovering a Small String
思路:枚举法。开三层循化来枚举。
// LUOGU_RID: 146982739
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n;
cin>>n;
string s1="zzz";
for (int i=0;i<26;i++){
for (int j=0;j<26;j++){
for (int k=0;k<26;k++){
if(i+j+k+3==n){
string s="";
s+=char(i+'a');
s+=char(j+'a');
s+=char(k+'a');
s1=min(s,s1);
}
}
}
}
cout<<s1<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--){
solve();
}
}
B. Make Equal
思路:从左向右遍历,如果前缀和小于平均值的前缀和,则不能。
因为水只能从左向右移动,而不能从右向左移动。
// LUOGU_RID: 146982497
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[200010],b[200010];
void solve()
{
int n;
cin>>n;
int sum=0;
for (int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
sum/=n;
int sum2=0;
for (int i=n;i>=1;i--){
sum2+=a[i];
if(sum2>sum*(n-i+1)){
cout<<"NO"<<endl;
return ;
}
}
cout<<"YES"<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--){
solve();
}
}
C. Make Equal Again
思路:双指针。因为只能该变一个区间,所以要让区间尽可能的大。从两侧向中间移动,在讨论两侧是否相同。
// LUOGU_RID: 146983734
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[200010];
void solve()
{
int n,ans=0;
cin>>n;
ans=n;
for (int i=1;i<=n;i++){
cin>>a[i];
}
int l=1,r=n;
while(a[l]==a[1] && l<=n) l++;
while(a[r]==a[n] && r>=1) r--;
ans=min(ans,n-l+1);
ans=min(ans,r);
if(l<=r && a[1]==a[n] ){
ans=min(ans,n-(l-1+n-r));
}
cout<<ans<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--){
solve();
}
}
D. Divisible Pairs
思路:裴蜀定理。因为(ai+aj)mod x==0 所以 (ai mod x + aj mod x )mod x = 0
所以ai可以写成(x-aj mod x)mod x 。
又因为 (ai+aj)mod y = 0 所以 ai mod y=aj mod y
于是,使用一个map 来装装对数。
// LUOGU_RID: 147112661
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[200010];
void solve()
{
int n,x,y;
cin>>n>>x>>y;
map<pair<int,int>,int> mp;
int ans=0;
for (int i=1;i<=n;i++){
int a;
cin>>a;
ans+=mp[make_pair((x-a%x)%x,a%y)];
mp[make_pair(a%x,a%y)]++;
}
cout<<ans<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--){
solve();
}
}
E. Anna and the Valentine's Day Gift
思路:博弈论。 简单的博弈论都是贪心问题。可以将题目转化为求长度的问题。
// LUOGU_RID: 147202010
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[200010];
void solve()
{
int n,m;
cin>>n>>m;
int len=0;//总长度
vector<int> b;
for (int i=1;i<=n;i++){
cin>>a[i];
int temp=a[i],res=0,shu=0;
int flag=1;
while(temp){
if(temp%10==0){
if(flag==1){
res++;//0的数量
}
}
else {
flag=0;
}
shu++;
temp/=10;
}
b.push_back(res);
len+=shu;
}
sort(b.begin(),b.end());//把每个数0的数量进行排序。
int cnt=0,shan=0;//要删除的长度。
for (int i=b.size()-1;i>=0;i--){
if(cnt==0){
shan+=b[i];
cnt=1;
}
else {
cnt=0;
}
}
if(len-shan<=m){
cout<<"Anna"<<endl;
}
else {
cout<<"Sasha"<<endl;
}
}
signed main()
{
int t;
cin>>t;
while(t--){
solve();
}
}