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;
    }
}
posted @ 2020-05-01 14:20  Hyx'  阅读(106)  评论(0)    收藏  举报