• 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
    ",ans);
        else
            printf("%.1lf
    ",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;
    }
    

      

  • 相关阅读:
    1、SASS / SCSS 总结简介
    Chrome 中的 JavaScript 断点设置和调试技巧
    《Javascript 设计模式》-读书笔记
    CSS基线之道
    高性能 CSS3 动画
    《编写高质量代码》web前端开发修炼之道-读书笔记
    《Effective JavaScript》编写高质量的Javascript代码的68个有效方法-读书笔记
    Sea.js-模块化开发框架
    JSLine和JSHint代码质量检查工具和uglifyjs压缩JS的
    在Windows平台上安装Node.js及NPM模块管理
  • 原文地址:https://www.cnblogs.com/lvguapi/p/12886793.html
Copyright © 2020-2023  润新知