# 题意
签到,给定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