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;
}

  

posted on 2020-05-14 10:18  吕瓜皮  阅读(168)  评论(0编辑  收藏  举报