码迷,mamicode.com
首页 > 其他好文 > 详细

C. Vasya and Basketball

时间:2014-12-04 06:16:09      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   os   sp   for   on   

·真的是发现每题都有坑。。。

这题主要目的是求一个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 
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

标签:style   blog   io   ar   color   os   sp   for   on   

原文地址:http://www.cnblogs.com/songacm/p/4141875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!