本文主要是介绍C. Vasya and Basketball,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
·真的是发现每题都有坑。。。
这题主要目的是求一个3分的分界线。题意就不多说了,主要说下自己的思路:
思路:
定义结构体,标识每个分数属于哪个队伍,然后将两个队伍的得分放在同一个数组中,从小到大进行排序。
之后从后向前。(即从大分数向小分数)
按照分数计算出Max{num1-num2};(num1为大于等于当前分数的队伍一的投球个数;num2为大于等于当前分数的队伍二的投球个数。)
算出临界点的球数差值对应的分数就为3分与2分得分界线。
之后进行计算得分输出即可。
·注意一个坑点: If there are several such scores, find the one in which number a is maximum.
这就需要将分界线订的越小越好,这样每队的得分才能更高,也就是令a越大。
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 #include <cstring> 5 #include <string.h> 6 #include <math.h> 7 #include <queue> 8 #include <stack> 9 #include <stdlib.h> 10 #include <map> 11 using namespace std; 12 #define LL long long 13 #define sf(a) scanf("%d",&(a)); 14 #define N 500010 15 16 typedef struct LNode{ 17 int flag; 18 int x; 19 }LNode; 20 LNode f[N]; 21 int cmd(LNode x,LNode y){ 22 return x.x < y.x; //从小到大排序 23 } 24 int last=0;int flag=0; 25 int main() 26 { 27 int n,m; 28 scanf("%d",&n); 29 for(int i=0;i<n;i++){ 30 scanf("%d",&f[i].x); 31 f[i].flag=1; 32 } 33 scanf("%d",&m); 34 for(int i=n;i<n+m;i++){ 35 scanf("%d",&f[i].x); 36 f[i].flag = 2; 37 } 38 sort(f,f+n+m,cmd); //从小到大排序 39 // for(int i=0;i<n+m;i++){ 40 // printf("%d %d\n",f[i].flag,f[i].x); 41 // } 42 int num1=0,num2=0; 43 int wei=f[n+m-1].x; 44 int maxc=-(1<<30); 45 for(int i=(n+m-1);i>=0;i--){ 46 while(1){ 47 if(f[i].flag==1) num1++; 48 else num2++; 49 50 if(i>0 && (f[i-1].x == f[i].x)){ 51 i--;continue; 52 } 53 else break; 54 } 55 //printf("num : %d %d\n",num1,num2); 56 int t = num1-num2; 57 if(t >= maxc){ //-------------一开始这里WA了一发, 没考虑到题目中说的,当相差分数相同时,选择a最大的情况,这里需要另wei最小! 58 59 if(flag==0){ 60 last = t; 61 flag=1; 62 maxc = t; 63 wei = f[i].x; //表示相差最大的时候,其3分线为多少。 64 }else{ 65 66 maxc = t; 67 wei = f[i].x; //表示相差最大的时候,其3分线为多少。 68 last = t; 69 70 } 71 } 72 } 73 //printf("num: %d %d\n",num1,num2); 74 //以 wei-1 为2分线,大于其的为3分。 75 //printf("分界线分数:%d\n",wei-1); //这里值可以为0!!! 76 77 num1=num2=0; 78 if(maxc < 0) wei =f[n+m-1].x+1; //这里判断一定要加 , 不然也会WA 79 for(int i=0;i<n+m;i++){ 80 if(f[i].flag==1) { 81 if(f[i].x >=wei) num1+=3; 82 else num1+=2; 83 } 84 else{ 85 if(f[i].x >=wei) num2+=3; 86 else num2+=2; 87 } 88 } 89 printf("%d:%d\n",num1,num2); 90 91 return 0; 92 }
其实这道题目的测试数据很好想,正规比赛应该自己多测几组的,以后多注意。
这篇关于C. Vasya and Basketball的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!