牛客小白月赛25(部分题解)

这篇博客详细解析了多个编程竞赛中的题目,包括AOE技能选择、字符串消除、分数统计、解方程、字母计数和矩阵计算。通过实例分析和代码展示,阐述了解题思路和高效算法的应用。
摘要由CSDN通过智能技术生成

比赛链接

A. AOE还是单体?

题意:

有两个技能:单体技能消耗1 mp;群体技能消耗x mp。
输入:第一行给出 怪物数量n 和 群体技能消耗的mp值x ;第二行给出 n只怪物的血量
输出:将怪物全部击杀所需的最少mp值

思路:

签到题。n 只怪物血量和为 sum,在 x < n 的情况下尽可能多的使用群体技能,得到mp值为res,取min(res, sum)即可。

代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 2e6+10;
int g[N];
int main()
{
    int n, x; cin >> n >> x;
    ll sum = 0;
    for(int i=1; i<=n; i++) {
        cin >> g[i];
        sum += g[i];
    }
    
    sort(g+1, g+1+n);
    if(x < n) {
        ll res = 0;
        for(int i=n-x+1; i<=n; i++) res += g[i];
        sum = min(sum, res);
    }
    
    cout << sum << endl;
    return 0;
}

E.点击消除

题意:

输入:一个字符串s,由小写字母组成。
相邻字符相同可被消除,消除的字符会消失,次数不限。
输出:消除后的s,如果为空,输出0。

思路:

类比括号匹配
遍历字符串s,s[i]与栈顶字符匹配
相同,栈顶出栈;不相同,则s[i]入栈
再将栈存入字符数组,倒序输出即可。

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5+10;
char ans[N];
int main()
{
    stack <char> st;
    string s; cin >> s;
    
    for(int i=0; i<s.size(); i++) {
        if(st.empty()) st.push(s[i]);
        else {
            if(s[i] == st.top()) st.pop();
            else st.push(s[i]);
        }
    }
    
    if(st.empty()) puts("0");
    else {
        int idx = 1;
        while(!st.empty()) {
            ans[idx++] = st.top();
            st.pop();
        }
        for(int i=idx-1; i>=1; i--) cout << ans[i];
        puts("");
    }
    return 0;
}

F.疯狂的自我检索者

题意:

分值:1~5分
输入:打分人数n 和 隐藏打分人数m;n-m 个为被隐藏的打分。
输出:可能的最低平均分和最高平均分。

思路:

水题。最低隐藏打分默认m个人打的都是1分,即m分,最高隐藏打分即为5*m分

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 2000010;

int main()
{
    int n, m; cin >> n >> m;
    
    if(n == m) {
        printf("1.00000 5.000000\n");
        return 0;
    }
    
    int res = n - m;
    int ans = 0;
    while(res--) {
        int t; cin >> t;
        ans += t;
    }
    double mink = (ans + m * 1.0) / n;
    double maxk = (ans + m * 5.0) / n;
    printf("%.5lf %.5lf\n",mink, maxk);
    return 0;
}

G.解方程

题意:

在这里插入图片描述
输入:三个整数a,b,c
输出:方程的解 x

思路:

利用 pow() 函数和 log() 函数,求得方程等号左侧的和,再二分法求得 x。

代码:

#include <bits/stdc++.h>
using namespace std;
/*浮点数二分问题*/
int a, b, c;
double check(double x)
{//计算方程等号左侧的和
    return pow(x, a) + b*log(x);
}
int main()
{
    cin >> a >> b >> c;
    double l=1e-9, r=1e9;
    int t = 1000;
    while(t--) {
        double mid = (l+r)/2;
        if(check(mid) >= c) r = mid;
        else l = mid;
    }
    printf("%.14lf\n", r);
    return 0;
}

H.神奇的字母(二)

题意:

输入:多行字符串,由小写字母和空格组成。
输出:出现次数最多的字母。

思路:

开个数组统计字母出现次数,巧用ASCII码。
遍历数组,找到值最大的那个,根据其下标输出对应字母。

代码:

#include <bits/stdc++.h>
using namespace std;

int num[26];
int main()
{
    string s;
    while(cin >> s) {
        for(int i=0; i<s.size(); i++) 
            num[s[i]-97]++;
    }
    int res = 0, p;
    for(int i=0; i<26; i++) {
        if(num[i] > res) {
            res = num[i];
            p = i;
        }
    }
    cout << (char)(p+97) << endl;
    return 0;
}

I.十字爆破

题意:

输入:行m 和 列n;矩阵m * n。
输出:m * n矩阵,新的mp[ i ][ j ]等于其所在行和列所有方格内的整数之和。

思路:

hh[ i ] 为第 i 行的所有整数之和;ll[ j ] 为第j列所有的整数之和。
新的mp[ i ][ j ] = hh[ i ] + ll[ j ] - 输入的mp[ i ][ j ]
注:

  1. m * n ≤ 1e6,用二维数组会越界,故用一维数组存;
  2. 输入的mp[ i ][ j ] ≤ 1e9,输出时会爆int,故用long long。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
typedef long long LL;

LL s[N];
LL hh[N], ll[N];
int main()
{
    int n, m; scanf("%d%d",&n,&m);
    int idx = 1;
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            LL t; scanf("%lld", &t);
            s[idx++] = t;
            hh[i] += t;
            ll[j] += t;
        }
    }
    
    idx = 1;
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) printf("%lld ", hh[i]+ll[j]-s[idx++]);
        printf("\n");
    }
    return 0;
}

exp()函数 和 log()函数

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值