• 小白月赛25题解


    a.aoe还是单体

    题意:给定2个方法,问怎么样能将n个怪物的血量都减成0,消耗mp最少。

    题解:第一个方法是消耗1mp,随机使一个怪物血量-1,第二个方法是消耗xmp,使所有怪物血量都-1.所以先排序,只要判断如果x<=n时,把第x个怪物的血量*x,这样就能把x个怪物都变成0,剩下的怪物血量用第一种方法就可以了。

    代码:

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll n,x,sum=0;
    int a[500000];
    int main() {
        cin>>n>>x;
        for(int i=0; i<n; i++) {
            cin>>a[i];
        }
        sort(a,a+n);
        if(x<n) {
            sum+=x*a[n-x-1];
            for(int i=n-x; i<n; i++) {
                sum+=a[i]-a[n-x-1];
            }
        }
        else{
            for(int i=0;i<n;i++){
                sum+=a[i];
            }
        }
        cout<<sum<<endl;
        return 0;
    }

    b.点击消除

    题意:给定一个字符串如果两个相邻的字符相同可以消除,然后把2个字符删除,把后面的接上来继续判断。

    题解:如果想到用stl模板的话就很简单。就是一直循环判断,直到没有东西可以消除时,结束循环,消除用erase(i,2)就是消除这个字符和它后面的字符,然后接着判断。

    代码:

    #include<iostream>
    #include<string>
    using namespace std;
    int main() {
        int flag=1;
        string a;
        cin>>a;
        while(flag!=0) {
            flag=0;
            /*if(a.size()==2&&a[0]==a[1]){
                cout<<0<<endl;
                return 0;
            }*/
            for(int i=0; i<a.size(); i++) {
                if(a[i]==a[i+1]) {
                    a.erase(i,2);
                    flag=1;
                }
            }
            if(flag==0) {
                break;
            }
        }
        if(a.size()==0){
            cout<<0<<endl;
            return 0;
        }
        cout<<a<<endl;
        return 0;
    }

    f.疯狂的自我检索者

    题意:有n个人为她打分,但是只知道m个人的分数,问平均分最大和最小是多少。

    题解:n-m个人的分数给定一个范围了,最大就是5*(n-m),最小就是1*(n-m)然后把其他知道的分数加起来除以n就是平均分了

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int n,m,k;
        double x;
        double sum1,sum2,sum=0;
        cin>>n>>m;
        if(n==m){
            sum1=1;
            sum2=5;
            printf("%.5f %.5f
    ",sum1,sum2); 
        }
        else{
            k=n-m;
            while(k--){
                cin>>x;
                sum+=x;
            }
            printf("%.5f %.5f
    ",(sum+m)/n,(sum+5*m)/n);
        }
        return 0;
    }

    h.神奇的字母(2)

    题意:输入一堆字符串可以n行,判断哪个字符串最多

    题解:我是一个一个字符输出的a=getchar()当连续输出2个换行就结束,判断哪个最多用数组和排序就可以了(写得比较麻烦- -)

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    struct xx{
        int m;
        int n;
    }k[10001];
    bool cmp(xx p,xx q){
        return p.m>q.m;
    }
    int main() {
        char a,b;
        int t=1;
        a=getchar();
        k[a-96].m++;
        k[a-96].n=a-96;
        b=a;
        while(t<=1000){
            a=getchar();    
            if(a<='z'&&a>='a'){
                k[a-96].m++;
                k[a-96].n=a-96;
            }
            if(b=='
    '&&a=='
    '){
                break;
            }
            b=a;
            t++;
        }
        sort(k,k+t,cmp);
        cout<<char(k[0].n+96)<<endl;
        return 0;
    }

     i.十字爆破

    题意:给定一个n*m表格计算每个数字所占行和列的大小

    题解:设2个数组一个存x轴一个存y轴,然后遍历把ax[i]+ay[i]-本身就是值了

    代码:

    #include<stdio.h>
    #define ll long long
        ll n,m;
        ll a[1000001];
        ll sumx[3000001];
        ll sumy[3000001];
    int main(){
        scanf("%d %d",&n,&m);
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                scanf("%lld",&a[i*m+j]);
                sumx[i]+=a[i*m+j];
                sumy[j]+=a[i*m+j];
            }
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(j==m-1){
                    printf("%lld
    ",sumx[i]+sumy[j]-a[i*m+j]);
                }
                else{
                    printf("%lld ",sumx[i]+sumy[j]-a[i*m+j]);
                }
            }
        }
    }
  • 相关阅读:
    js读取解析json数据
    dot.js简单入门
    免费API接口整理
    综合方式输出通信数据
    redis常用
    数据库主从复制
    数据库存储过程
    数据库触发器
    局域网访问本地wampserver调试环境
    远程数据同步工具cwRsync
  • 原文地址:https://www.cnblogs.com/liyongqi/p/12930373.html
Copyright © 2020-2023  润新知