解题思路:
将胜国每个事件发生时相对于其他两国的兵力增量记录并排序,只要他的事件增量大于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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复