zoukankan      html  css  js  c++  java
  • P5016 龙虎斗

     题目地址


     易错点:

    • abs()在开long long时必须重写.
    • 在答案相同时优先选择编号较小的.
    • 开long long.

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #define ll long long
    using namespace std;
    const int MAXN=5e6;
    ll c[MAXN];//兵营的原始兵量 
    ll m,n;
    ll getASum(){//获取A阵营的总气势 
    	ll ASum=0;
    	for(int i=1;i<=m-1;i++){
    		ASum+=c[i]*abs(m-i);
    	}
    	return ASum;
    }
    ll getBSum(){//获取B阵营的总气势 
    	ll BSum=0;
    	for(int i=m+1;i<=n;i++){
    		BSum+=c[i]*abs(m-i);
    	}
    	return BSum;
    }
    bool isFromA(ll x){//判断是否属于A阵营 
    	return (x<m);
    }
    ll absK(ll val){
    	if(val>=0)return val;
    	return -val;
    }
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>c[i];
    	}
    	//中立势力 
    	//免费赠送兵位置 数量 
    	int p1,s1,
    	s2;//自己的兵量 
    	cin>>m>>p1>>s1>>s2;
    	c[p1]+=s1;//免费送兵 
    	ll Asum=0,Bsum=0;//两个阵营的总气势 
    	Asum=getASum(),Bsum=getBSum();
    	ll ansIndex,ansDelta;//当前位置和当前气势差值
    	ansIndex=m,ansDelta=absK(Asum-Bsum);
    	for(int i=1;i<=n;i++){//尝试在每个兵营加气势
    		if(i==m)continue; 
    		bool isA=isFromA(i);//是否属于A阵营
    		if(isA){//如果属于A阵营
    			ll newAsum=Asum+s2*absK(m-i);//A阵营新总值
    			ll newDelta=absK(newAsum-Bsum); 
    			if(newDelta<ansDelta){//能更新 
    				ansDelta=newDelta;
    				ansIndex=i;
    			}else if(newDelta==ansDelta&&i<ansIndex){
    				ansIndex=i;
    			}
    		}else{
    			ll newBsum=Bsum+s2*absK(m-i);
    			ll newDelta=absK(Asum-newBsum);
    			if(newDelta<ansDelta){
    				ansDelta=newDelta;
    				ansIndex=i;
    			}else if(newDelta==ansDelta&&i<ansIndex){
    				ansIndex=i;
    			}
    		}
    	}
    	printf("%lld
    ",ansIndex);
    	return 0; 
    }
    
  • 相关阅读:
    Spring学习记录-源码构建
    Spring学习记录
    java相关技术提纲
    Seata 分布式事务框架
    SourceTree学习记录
    其他源码管理工具
    分布式事务
    Score (模拟题)
    大整数排序
    字符串的查找删除 时间限制:1 Seconds 内存限制:32 Mbyte
  • 原文地址:https://www.cnblogs.com/zbsy-wwx/p/11708884.html
Copyright © 2011-2022 走看看