文章目录
- A. [AOE还是单体?](https://ac.nowcoder.com/acm/contest/22541/A)
- E.[点击消除](https://ac.nowcoder.com/acm/contest/22541/E)
- F.[疯狂的自我检索者](https://ac.nowcoder.com/acm/contest/22541/F)
- G.[解方程](https://ac.nowcoder.com/acm/contest/22541/G)
- H.[神奇的字母(二)](https://ac.nowcoder.com/acm/contest/22541/H)
- I.[十字爆破](https://ac.nowcoder.com/acm/contest/22541/I)
- exp()函数 和 log()函数
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 ]
注:
- m * n ≤ 1e6,用二维数组会越界,故用一维数组存;
- 输入的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()函数

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

621

被折叠的 条评论
为什么被折叠?



