AcWing 第16场周赛

统一大小写

按题意
1.统计大小写字母个数
2.按照要求转换为小写或大写,输出

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;
bool check(char c){//判断大小写
    if(c>='a' && c<='z') return 1;
    else return 0;
}
string s;
int t;
int main(){
    cin>>t;
    while(t--){
        cin>>s;
        int x=0,d=0;
        int len=s.length();
        for(int i=0;i<len;++i){
            if(check(s[i])) x++;
            else d++;
        }
        for(int i=0;i<len;++i){
            if(d<=x) {
                if(check(s[i])) cout<<s[i];
                else {
                    char c=s[i]-'A'+'a';//转换为小写
                    cout<<c;
                }
            }
            else {
                if(check(s[i])) {
                    char c=s[i]-'a'+'A';//转换为大写
                    cout<<c;
                }
                else  cout<<s[i];
            }
        }
        cout<<endl;
    }return 0;
}

截断数组

当我发现正解后,直呼我是sb,(关于次次周赛都脑壳抽了的事)

既然分为三个数组,且元素和相等

每个数组的元素和为原数组的1/3

不存在分配方案即为(原数组总和)%3!=0的情况

sum[]为前缀和,averge=原数组总和/3
我们只需要寻找一个位置 sum[i]==averge*2

此时ans+=(sum[1~i-1]==averge)即可

因为第i位 满足2*averge, 又因为a[i+1]~a[n]的和则等于averge
所以只需要加上能使前i位的数组 分为 两个值为averge的位置 的数量即可

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

int n;const int maxn=1e5+10;
int m[maxn];
long long sum=0;
int main(){
    cin>>n;
    for(int i=1;i<=n;++i) cin>>m[i],sum+=m[i];
    if(sum%3) cout<<"0";
    else {
        long long averge=sum/3;
        long long  tot=0,js=0;
        long long ans=0;
        for(int i=1;i<n;++i){
            tot+=m[i];
            if(tot==2*averge) ans+=js;
            if(tot==averge) ++js;
        }cout<<ans<<endl;
    }return 0;
}

子序列

这个难度假了吧

根据样例都能看出来是取三个数形成一个凸或凹的三个数

例如 1 3 2 凸数 3 1 2 凹下去的数

直接确定第1个数和第n个数为左右点都能过17个点(建议加强数据)

当然正解稍微改动点点就可以
(相信你们能看懂代码)

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

int n;
const int maxn=1e5+10;
int m[maxn];
int ans=0;
int main(){
    cin>>n;
    for(int i=1;i<=n;++i) cin>>m[i];
    if(n<3){
        cout<<"0"<<endl;
        return 0;
    }

    int maxi=1,mini=1;
    for(int i=1;i<=n;++i){
        if(m[i]>m[maxi]) maxi=i;
        if(m[i]<m[mini]) mini=i;
    }
    int l=1,mid=0;
    for(int i=2;i<n;++i){
        if((m[i]<m[i+1] && m[i]<m[1])|| (m[i]>m[l] && m[i]>m[i+1])){
            mid=i;break;
        }
    }
    if(mid)cout<<3<<endl<<l<<" "<<mid<<" "<<mid+1<<endl;
    else cout<<"0"<<endl;
    return 0;
}
posted @ 2021-09-11 20:31  归游  阅读(406)  评论(0编辑  收藏  举报