小白月赛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]);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/liyongqi/p/12930373.html