2020.5.10 个人rating赛 解题+补题报告
Posted 吕瓜皮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020.5.10 个人rating赛 解题+补题报告相关的知识,希望对你有一定的参考价值。
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; }
以上是关于2020.5.10 个人rating赛 解题+补题报告的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 109 (Rated for Div. 2) 个人补题记录(A~D,AB思维,C模拟构造,D题DP)