# 题意
签到,给定n个数,m为最大值,平均数必须保持不变,求能取得的最大值
# 题解
ans=min(m,sum)
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define pii pair<int,int> 4 #define pll pair<ll,ll> 5 #define fi first 6 #define se second 7 #define pb push_back 8 using namespace std; 9 const int N=1e5+10; 10 int a[N]; 11 void solve(){ 12 int n,m; 13 cin>>n>>m; 14 int sum=0; 15 for(int i=1;i<=n;i++){ 16 cin>>a[i]; 17 sum+=a[i]; 18 } 19 if(sum>=m) 20 cout<<m<<endl; 21 else{ 22 cout<<sum<<endl; 23 } 24 } 25 int main(){ 26 int t; 27 cin>>t; 28 while(t--){ 29 solve(); 30 } 31 32 }
# 题意
一个字符串,可以执行的操作是一个数k(1<=k<=n) , i从1 到 n-k+1,将s[i~i+k-1]所有reverse,求出一个k来使得操作后的字符串是字典序最小的,如果有多个满足的k,求最小的k
# 题解
首先我们有一个字符串 s,
我们可以把它表示为 s1s2s3…sn,然后我们选择一个 k:
经过第一次反转: sksk−1sk−2…s1sk+1sk+2…sn
观察到之后 sk的位置就不会发生变化了。
经过第二次反转: sksk+1s1…sk−2sk−1sk+2…sn观察到之后 sksk+1的位置都不会发生变化。
经过第三次反转: sksk+1sk+2…s2s1sk+3…sn观察到之后 sksk+1sk+2 的位置不会再发生变化。
……
以此类推,最后反转变换过后的字符串 s' 前n−k+1个字符一定是 sksk+1sk+2…sn
通过观察还可发现, s 中的前 k−1个字符 s1s2s3…sk−1 一定会被搬到 s' 的后半部分,但是方向不确定。
反转次数是 n−k+1,当反转次数是奇数最后拼接的需要反转,偶数直接拼接
时间复杂度O(N2)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int T,n,ans; 4 string s,mn; 5 string work(int k) 6 { 7 if(k==n) 8 { 9 string res=s; 10 reverse(res.begin(),res.end()); 11 return res; 12 } 13 int t=n-k+1; 14 if(t%2==0) 15 { 16 string res=s.substr(k-1,n-k+1); 17 res+=s.substr(0,k-1); 18 return res; 19 } 20 string res=s.substr(k-1,n-k+1); 21 string tmp=s.substr(0,k-1); 22 reverse(tmp.begin(),tmp.end()); 23 res=res+tmp; 24 return res; 25 } 26 int main() 27 { 28 scanf("%d",&T); 29 while(T--) 30 { 31 scanf("%d",&n); 32 cin>>s; 33 ans=1,mn=s; 34 for(int i=2;i<=n;i++) 35 if(work(i)<mn) 36 mn=work(i),ans=i; 37 cout<<mn<<endl<<ans<<endl; 38 } 39 }
# C
# 题意
# 题解
# D
# 题意
# 题解
# E
来源:https://www.cnblogs.com/hhyx/p/12424197.html