吃早饭


私信TA

用户名:dotcpp0721969

访问量:4040

签 名:

等  级
排  名 2461
经  验 2267
参赛次数 0
文章发表 22
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:
将胜国每个事件发生时相对于其他两国的兵力增量记录并排序,只要他的事件增量大于0,那么这个事件就可以发生,最后从三个国家获胜情况中找到最大的事件数即可
注意事项:

参考代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
ll s[3][N];//用 s[i][n]记录胜国相对于其他两国兵力的增加 
int num[3];//记录可以发生的事件数目
int n;
void solve(){
	int a[n],b[n],c[n];//记录各自事件 
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<n;i++){
		cin>>b[i];
	}
	for(int i=0;i<n;i++){
		cin>>c[i];
	}
	//要获胜就要满足x+y>z;即z-x-y>0;
	//以下记录各方为胜时的情况 (z-x-y)
	//用 s[i][n]记录胜国相对于其他两国兵力的增加 
	for(int i=0;i<3;i++){
		if(i==0){//a国为胜 
			for(int j=0;j<n;j++){
				s[i][j] = a[j] - b[j] - c[j];
			} 			 
		}
		else if(i==1){//b国为胜 
			for(int j=0;j<n;j++){
				s[i][j] = b[j] - c[j] - a[j];
			} 		
		}	
		else{//c国为胜 
			for(int j=0;j<n;j++){
				s[i][j] = c[j] - b[j] - a[j];
			} 
		}
		sort(s[i],s[i]+n) ;//从小到大排序 
	}	
	for(int i=0;i<3;i++){
		// s[i][n]已经排序了,找到总和为0的临界值 
		for(int j=n-1;j>=0;j--){
			s[i][n]+=s[i][j];
			num[i]++;//可以发生的事件数目
			if(s[i][n]<0){//该事件发生导致胜方军力小于另外两国,不符获胜条件,故减一 
				num[i]--;
				break;//找到该国获胜情况下发生事件最多的数目 
			}
		} 
	}
	int max1;
	//从3中情况中找到最大 
	max1 = max(num[0],max(num[1],num[2]));
	cout<<max1;	
}
int main()
{
	memset(num,0,sizeof(num)); 
	cin>>n;
	solve();
	return 0;
}


 

0.0分

3 人评分

  评论区

  • «
  • »