B. 伤害计算
1.题意
给定一个字符串,含有两种形式,一种是一个数字,一种是两个数字之间一个字母d(例:xdy),前者表示武器伤害值,后者表示伤害值为扔 x个y面的骰子所得的值,输出武器伤害值的期望和。
2.题解
遍历字符串,分情况计算即可,不过输出有点坑。
3.代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e3 + 5;
char arr[maxn][100];
char ch[100];
int a[maxn],b[maxn];
string str;
double ans;
int main() {
cin>>str;
str[str.size()] = '+';
int k=1,t=1;
int flag=0;
for(int i=0;i<=str.size();i++){
if(str[i] != '+' && str[i] != 'd'){
ch[k++] = str[i];
}
else{
// for(int q=1;q<k;q++){
// cout<<ch[q];
// }
// cout<<endl;
double num=0.0;
for(int j=1;j<k;j++){
num += (ch[j]-'0')*pow(10,k-1-j);
}
// cout<<num<<endl;
k=1;
if (str[i] == 'd'){
a[t]=num;
flag=1;
}
else if (str[i] == '+'){
if(flag){
b[t++]=num;
flag=0;
}
else{
ans += num;
}
}
else{
ans += num;
}
}
}
for(int i = 1;i < t;i++) {
// cout<<a[i]<<' '<<b[i]<<endl;
double x = (1+b[i])/2.0;
x *= (double)a[i];
// cout<<x<<endl;
ans += x;
}
if((int)ans*1.0 == ans)
printf("%.0lf\n",ans);
else
printf("%.1lf\n",1.0*ans);
return 0;
}
F. 排列计算
1.题意
自己构造一个从1到n的整数数列,数字不能重复,给定m次查询[l,r],查询结果为数列中从l到r的数字之和 ,输出使的所有查询结果之和最大化。
2.题解
共m次查询,查询到的数字次数越多,就让他的值越大,利用差分前缀和求出每个数字被查询的次数,然后排序,出现次数最小的对应1,最大的对应n即可。
3.代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e5 + 5;
int arr[maxn];
int main(){
int n, m;
cin>> n>> m;
for(int i = 1; i <= m; i++){
int l, r;
cin>> l>> r;
arr[l]++;
arr[r + 1]--;
}
for(int i = 1; i <= n; i++){
arr[i] += arr[i - 1];
}
sort(arr + 1, arr + n + 1);
ll ans = 0;
for(int i = 1; i <= n; i++)
ans += arr[i] * i * (ll)1;
cout<< ans<< endl;
return 0;
}
浙公网安备 33010602011771号