codeforce codecraft-20 div2
A.Grade Allocation
给定\(n\)个数,\(m\)为最大值,平均数必须保持不变,求能取得的最大值
\(ans=min(m,sum)\)
Code
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define pb push_back
using namespace std;
const int N=1e5+10;
int a[N];
void solve(){
int n,m;
cin>>n>>m;
int sum=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
if(sum>=m)
cout<<m<<endl;
else{
cout<<sum<<endl;
}
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}
B.String Modification
一个字符串,可以执行的操作是一个数\(k(1\leq k \leq n)\) , \(i\) 从\(1\) 到 \(n-k+1\),将\(s[i \sim i+k-1]\)所有reverse,求出一个\(k\)来使得操作后的字符串是字典序最小的,
如果有多个满足的\(k\),求最小的\(k\)
字符串 \(s\),\(s_{1},s_{2},s_{3},\dots,s_{n}\),选择一个 \(k\):
第一次反转: \(s_{k},s_{k-1},s_{k-2},\dots,s_{1},s_{k+1},s_{k+2},\dots ,s_{n}\), 观察到之后 \(s_{k}\)的位置就不会发生变化了。
经过第二次反转: \(s_{k},s_{k+1},s_{1},\dots,s_{k-2},s_{k-1},s_{k+2},\dots ,s_{n}\), 观察到之后 \(s_{k},s_{k+1}\)的位置都不会发生变化。
经过第三次反转: \(s_{k},s_{k+1},s_{k+2},\dots,s_{2},s_{1},s_{k+3},\dots ,s_{n}\), 观察到之后 \(s_{k},s_{k+1},s_{k+2}\) 的位置不会再发生变化。
……
以此类推,最后反转变换过后的字符串 \(s\) ' 前\(n−k+1\)个字符一定是 $s_{k},s_{k+1},s_{k+2},\dots,s_{n} $
通过观察还可发现, \(s\) 中的前 \(k−1\)个字符 \(s_{1},s_{2},s_{3},\dots,s_{k−1}\) 一定会被搬到 \(s\) ' 的后半部分,但是方向不确定。
反转次数是 \(n−k+1\),当反转次数是奇数最后拼接的需要反转,偶数直接拼接
时间复杂度\(O(N^{2})\)
Code
#include<bits/stdc++.h>
using namespace std;
int T,n,ans;
string s,mn;
string work(int k)
{
if(k==n)
{
string res=s;
reverse(res.begin(),res.end());
return res;
}
int t=n-k+1;
if(t%2==0)
{
string res=s.substr(k-1,n-k+1);
res+=s.substr(0,k-1);
return res;
}
string res=s.substr(k-1,n-k+1);
string tmp=s.substr(0,k-1);
reverse(tmp.begin(),tmp.end());
res=res+tmp;
return res;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
cin>>s;
ans=1,mn=s;
for(int i=2;i<=n;i++)
if(work(i)<mn)
mn=work(i),ans=i;
cout<<mn<<endl<<ans<<endl;
}
}

浙公网安备 33010602011771号