首页 > 代码库 > C. Vasya and Basketball
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 50001015 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 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 int num1=0,num2=0;40 int wei=f[n+m-1].x;41 int maxc=-(1<<30);42 for(int i=(n+m-1);i>=0;i--){43 while(1){44 if(f[i].flag==1) num1++;45 else num2++;46 47 if(i>0 && (f[i-1].x == f[i].x)){48 i--;continue;49 }50 else break;51 }52 int t = num1-num2;53 if(t >= maxc){ //-------------一开始这里WA了一发, 没考虑到题目中说的,当相差分数相同时,选择a最大的情况,这里需要另wei最小!54 maxc = t;55 wei = f[i].x; //表示相差最大的时候,其3分线为多少。56 }57 }58 //printf("num: %d %d\n",num1,num2);59 //以 wei-1 为2分线,大于其的为3分。60 //printf("分界线分数:%d\n",wei-1); //这里值可以为0!!!61 num1=num2=0;62 for(int i=0;i<n+m;i++){63 if(f[i].flag==1) {64 if(f[i].x >=wei) num1+=3;65 else num1+=2;66 }67 else{68 if(f[i].x >=wei) num2+=3;69 else num2+=2;70 }71 }72 printf("%d:%d\n",num1,num2);73 74 return 0;75 }
C. Vasya and Basketball
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。