解题思路:
将胜国每个事件发生时相对于其他两国的兵力增量记录并排序,只要他的事件增量大于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语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:594 |
2005年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:518 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:639 |
简单的a+b (C语言代码)浏览:569 |
2^k进制数 (C语言描述,蓝桥杯)浏览:1452 |
简单的a+b (C语言代码)浏览:534 |
生日日数 (C语言代码)浏览:1561 |
简单的a+b (C语言代码)浏览:535 |
母牛的故事 (C语言代码)浏览:498 |
C语言训练-求具有abcd=(ab+cd)2性质的四位数 (C语言代码)浏览:931 |