2017 湖南省赛 K Football Training Camp

题意:

在一次足球联合训练中一共有\(n\)支队伍相互进行了若干场比赛。 对于每场比赛,赢了的队伍得3分,输了的队伍不得分,如果为平局则两支队伍各得1分。

现在给出每只队伍的得分\(s_i\),问最少和最多进行了多少场比赛,不超过1000组数据

\(1<=n<=20\)

\(0<=s_i<=200\)

思路:

比赛的时候脑子不清醒,被这个配对难住了,暴力往搜索方面想了想,肯定会TLE啦,就放弃了

现在清醒一点,胜负局对胜负配对没有影响,只有平局对配对有影响,而且平局越多,比的场次也越多

如果设胜负局有\(x\)场,平局\(y\)场,则有\(3x + 2y = sum\)

枚举\(x\), 判断是否可以出现\(y\)场平局,但是这里取胜的队伍策略不固定,所以不好判断平局是否可以出现

现在问题就变成 给一个局面 如何判断当前局面,可以全打平局

当且仅当 \(sum\) 为偶数, 且\(max <= sum / 2\)

\(sum\)为偶数是显然的,若\(max > sum / 2\), 那么剩下的数无法消除\(max\)

考虑这样一种方法,假设\(a_1,a_2,...a_n\)为得分从小到大排序后的序列,找到中线所在的位置

令\(psum[i]\)为分数的前缀和,假设\(i\)为一个满足 \(psum[i-1] + a_i >= sum / 2\)的位置

若\(psum[i-1] + a_i = sum / 2\) 显然就可以将\(a_1,...a_i\)和\(a_{i+1},...a_n\)这两部分配对即可

若\(psum[i-1] + a_i > sum / 2\) 这样将\(a_i\)分成了两部分,将左边部分\(sum / 2 - psum[i-1]\)用\(a_{i+1},...a_n\)消掉,右边部分\(psum[i] - sum / 2\)用\(a_1,...a_i\)消掉

然后\(a_{i+1},...a_n\) 与 \(a_1,...a_i\)配对即可

这样若$max > sum / 2 $那么中线一定会出现在 \(a_n\) 中,就无法成功配对了。

知道了这个结论,现在只需要每次贪心将\(max\) 取一场胜负局,再接着判定平局是否合法即可

#include<queue>
#include<algorithm>
#include<iostream>
#include<cstdio> #define LL long long using namespace std; priority_queue<int > q;
int main(){ int n;
while(scanf("%d",&n) == 1){
int x,ansmx = 0,ansmi = 0;
while(!q.empty()) q.pop();
int sum = 0;
for(int i = 1;i <= n;i++){
scanf("%d",&x);
q.push(x);
sum += x;
}
int cnt = 0;
while(!q.empty()){
x = q.top();q.pop();
if(sum % 2 == 0 && x <= sum / 2) {
if(!ansmx) ansmx = cnt + sum / 2;
ansmi = cnt + sum / 2;
}
if(x < 3) break;
sum -= 3;
q.push(x - 3);
cnt++; }
cout<<ansmi<<" "<<ansmx<<endl;
}
return 0;
}

2017 湖南省赛 K Football Training Camp的更多相关文章

  1. 湖南省第十三届大学生计算机程序设计竞赛 Football Training Camp 贪心

    2007: Football Training Camp[原创-转载请说明] Submit Page   Summary   Time Limit: 1 Sec     Memory Limit: 1 ...

  2. CSU-2007 Football Training Camp

    Football Training Camp 在一次足球联合训练中一共有n支队伍相互进行了若干场比赛. 对于每场比赛,赢了的队伍得3分,输了的队伍不得分,如果为平局则两支队伍各得1分. Input 输 ...

  3. 【数论】【原根】【动态规划】【bitset】2017四川省赛 K.2017 Revenge

    题意: 给你n(不超过200w)个数,和一个数r,问你有多少种方案,使得你取出某个子集,能够让它们的乘积 mod 2017等于r. 2017有5这个原根,可以使用离散对数(指标)的思想把乘法转化成加法 ...

  4. Petrozavodsk Summer Training Camp 2017 Day 9

    Petrozavodsk Summer Training Camp 2017 Day 9 Problem A. Building 题目描述:给出一棵树,在树上取出一条简单路径,使得该路径的最长上升子序 ...

  5. Petrozavodsk Summer Training Camp 2017

    Petrozavodsk Summer Training Camp 2017 Problem A. Connectivity 题目描述:有\(n\)个点,现不断地加边.每条边有一种颜色,如果一个点对\ ...

  6. ACM总结——2017湖南省省赛总结

    2017省赛已经结束了2天了,今天终于有时间,也有勇气来写下这一篇总结.的确,这是我第一次正式的ACM线下赛,我本以为再不济,也可以拿个三等奖,没想到,实力打铁.确实对我打击比较大,以前的确是知道自己 ...

  7. 2016 Al-Baath University Training Camp Contest-1

    2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...

  8. 2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest (5/9)

    2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest B. Forcefield 题意 给你一维平面上n个镜子 ...

  9. Petrozavodsk Winter Training Camp 2018

    Petrozavodsk Winter Training Camp 2018 Problem A. Mines 题目描述:有\(n\)个炸弹放在\(x\)轴上,第\(i\)个位置为\(p_i\),爆炸 ...

随机推荐

  1. css实现未知元素宽高垂直居中和水平居中的方法

    第一种:display:table-cell的方式 .container { /*父级容器*/ display:table-cell; text-align:center; vertical-alig ...

  2. Yaf学习(二)----Yaf初体验

    1.hello world 1.1 用yaf输出hello world 1.首先配置host,nginx 2.host不用多说,指向虚拟机IP即可 1.2 重点说一下nginx (只说server块) ...

  3. 实用脚本 2 -- Linux下定时执行脚本

    今天学习Linux下定时执行脚本,看到一篇讲解比较好的文章,特此拿来分享. 原文链接:http://www.blogjava.net/decode360/archive/2009/09/18/2877 ...

  4. 根据生产场景对Linux系统进行分区

    转自:http://oldboy.blog.51cto.com/2561410/629558 老鸟谈生产场景如何对linux系统进行分区? █  前言:    我们买房子时,会考虑1室1厅,2室1厅, ...

  5. hadoop中的方法的作用

    /*  * InputFormat类:  *   * 作用:  * 1.设置输入的形式;  * 2.将输入的数据按照相应的形式分割成一个个spilts后再进一步拆分成<key,value> ...

  6. Android学习笔记之,调用系统图库,添加自定义字体,屏幕截图

    新年开始的第一天就来学习了慕课迎春活动中的Android心愿分享一课,学到了几个知识点,在此记录一下. 1.调用系统图库调用系统图库用的是intent,步骤为弹出系统图库选择器,选择图片后获取到所选择 ...

  7. Android PopupWindow 疑难杂症之宽度WRAP_CONTENT

    一直以来都觉得 Android 中的 PopupWindow 不好用.主要有以下两点:1.宽度不好控制2.位置不好控制 今天单说第1点. 由于应用有好几种国家的语言,加上各设备宣染效果不完全一样,对p ...

  8. 适用于Linux的windows子系统

    Windows基于图形界面的易用性是有目共睹的,这也是很多普通用户往往难以舍弃的原因.但是Linux系统更强大的网络应用开发能力,却又是Windows系统所无法比拟的.一直以来,很多人都在试图采用各种 ...

  9. 深挖 NGUI 基础 之UIRoot (一)

    当你开始使用NGUI的时候,简单的从项目视图 中一个”Control”预设体 拖拽到场景视图中,你将会发现 Hierarchy层次面板中会出现以下层次结构: 其中 UI Root作为根节点,是每个NG ...

  10. Struts2(三.用户登录状态显示及Struts2标签)

    1.编写main.jsp /WebContent/main.jsp 之前用户登录时已把用户存入session <%@ page language="java" content ...