zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    第三方支付
    优化MySQL插入方法的五个妙招
    MySQL的数据类型和建库策略详解
    mysql 文本搜索
    mysql 存储过程
    mysql 游标的使用
    mysql 触发器
    mysql 保留点
    MySQL 使用硬链接配合truncate 删除2.2T的表
    25-ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/lvguapi/p/12886793.html
Copyright © 2011-2022 走看看