刷题记录Codeforces Round 925 (A,B,C)
1.A. Recovering a Small String
输入:
5
24
70
3
55
48
输出:
aav
rzz
aaa
czz
auz
给定一个3~78的整数,将这个整数分成a,b,c,其中1表示'a',26表示'z',按照这个规则,得到一个字典序最小的字符串,字符串有这个三个整数转成。
下面是AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
char kp[]="abcdefghijklmnopqrstuvwxyz";
void solve()
{
int n;
cin>>n;
for(int i=1;i<=26;i++){
for(int j=1;j<=26;j++){
int k=n-i-j;
if(k<=26)
{
string s="";
s+=kp[i-1];
s+=kp[j-1];
s+=kp[k-1];
cout<<s<<"\n";
return;
}
}
}
}
int main()
{
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
2.B. Make Equal
输入:
6
1
43
2
1 3
5
4 5 2 1 3
3
1 2 3
7
4 5 5 0 6 4 4
7
6 5 5 1 3 4 4
输出:
YES
NO
YES
NO
NO
YES
题目要求我们只能将左边的水倒到右边的桶,如果最后不能使得全部桶的水都一样对,则输出NO,反之输出YES,我们只需要求出后缀和,变量判断此时的后缀和是否小于等于变量的元素数*最后的平均数即可,如果出现大于的情况,则最后桶的水不能都一样。
下面是AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
void solve()
{
ll n;
cin>>n;
vector<ll>a(n),b(n),q(n);
ll sum=0;
for(int i=0;i<n;i++){
cin>>a[i];
b[n-1-i]=a[i];
sum+=a[i];
}
ll k=sum/n;
q[0]=b[0];
for(int i=1;i<n;i++){
q[i]=q[i-1]+b[i];
}
for(int i=0;i<n;i++){
if(q[i]>(i+1)*k)
{
cout<<"NO\n";
return;
}
}
cout<<"YES\n";
}
int main()
{
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
3.C. Make Equal Again
题目想要将数组的全部数变为一致,通过将i到j的数全部变为k的方法,操作代价为j-i+1。
因为我们需要输出最小代价。
当数组的首元素等于尾元素时,输出(n-前缀最长连续的相同元素-后缀最长连续的相同元素)(可能出现答案为负数的情况,此时输出0)。
反正,输出(n-前缀最长连续的相同元素和后缀最长连续的相同元素的最大值)
下面是AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
void solve()
{
ll n;
cin>>n;
vector<ll>a(n);
for(int i=0;i<n;i++){
cin>>a[i];
}
ll i1=0,i2=0;
while(i1<n&&a[i1]==a[0]){
i1++;
}
while(i2<n&&a[n-i2-1]==a[n-1]){
i2++;
}
if(a[0]!=a[n-1])
cout<<(n-max(i1,i2))<<"\n";
else cout<<max((ll)0,(n-i1-i2))<<"\n";
}
int main()
{
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}