A. Toda 2
2 seconds
512 megabytes
standard input
standard output
A group of n friends enjoys playing popular video game Toda 2. There is a rating system describing skill level of each player, initially the rating of the i-th friend is ri.
The friends decided to take part in the championship as a team. But they should have equal ratings to be allowed to compose a single team consisting of all n friends. So the friends are faced with the problem: how to make all their ratings equal.
One way to change ratings is to willingly lose in some matches. Friends can form a party consisting of two to five (but not more than n) friends and play a match in the game. When the party loses, the rating of each of its members decreases by 1. A rating can't become negative, so ri = 0 doesn't change after losing.
The friends can take part in multiple matches, each time making a party from any subset of friends (but remember about constraints on party size: from 2 to 5 members).
The friends want to make their ratings equal but as high as possible.
Help the friends develop a strategy of losing the matches so that all their ratings become equal and the resulting rating is maximum possible.
The first line contains a single integer n (2 ≤ n ≤ 100) — the number of friends.
The second line contains n non-negative integers r1, r2, ..., rn (0 ≤ ri ≤ 100), where ri is the initial rating of the i-th friend.
In the first line, print a single integer R — the final rating of each of the friends.
In the second line, print integer t — the number of matches the friends have to play. Each of the following t lines should contain ncharacters '0' or '1', where the j-th character of the i-th line is equal to:
- '0', if friend j should not play in match i,
- '1', if friend j should play in match i.
Each line should contain between two and five characters '1', inclusive.
The value t should not exceed 104, it is guaranteed that such solution exists.
Remember that you shouldn't minimize the value t, but you should maximize R. If there are multiple solutions, print any of them.
思路:贪心;
因为可以同时操作2-5个,那么我们只要讨论时操作2个或三个就行了因为2,3能组成其他数,然后每次分类,当当前的数有偶数个,那么每次操作2个,当前为1的时候也操作2个,否则操作3个,并且选出的是最大的,这个用优先队列维护。
1 #include<stdio.h>
2 #include<algorithm>
3 #include<stdlib.h>
4 #include<queue>
5 #include<string.h>
6 #include<iostream>
7 #include<math.h>
8 using namespace std;
9 typedef struct node
10 {
11 int id;
12 int cost;
13 bool operator<(const node&cx)const
14 {
15 return cx.cost > cost;
16 }
17 } ss;
18 int ans[1000];
19 int ab[10005][105];
20 priority_queue<ss>que;
21 int flag[1005];
22 int main(void)
23 {
24 int n;
25 scanf("%d",&n);
26 int i,j;
27 for(i = 0; i < n; i++)
28 {
29 scanf("%d",&ans[i]);
30 }
31 memset(ab,0,sizeof(ab));
32 while(!que.empty())
33 que.pop();
34 memset(flag,0,sizeof(flag));
35 int cn = 0;
36 for(i = 0; i < n; i++)
37 {
38 if(!flag[ans[i]])
39 {
40 cn++;
41 }
42 flag[ans[i]]++;
43 ss ak;
44 ak.cost = ans[i];
45 ak.id = i;
46 que.push(ak);
47 }
48 int cnt = 0;
49 while(cn>1)
50 {
51 ss a = que.top();
52 que.pop();
53 ss b = que.top();
54 que.pop();
55 if(a.cost!=b.cost)
56 {
57 if(a.cost>0)
58 {
59 flag[a.cost]--;
60 if(flag[a.cost]==0)cn--;
61 if(flag[a.cost-1]==0)cn++;
62 a.cost--;
63 flag[a.cost]++;
64 }
65 if(b.cost>0)
66 {
67 flag[b.cost]--;
68 if(flag[b.cost]==0)cn--;
69 if(flag[b.cost-1]==0)cn++;
70 b.cost--;
71 flag[b.cost]++;
72 }
73 ab[cnt][a.id]++;
74 ab[cnt][b.id]++;
75 }
76 else if(flag[a.cost]%2==0)
77 {
78 if(a.cost>0)
79 {
80 flag[a.cost]--;
81 if(flag[a.cost]==0)cn--;
82 if(flag[a.cost-1]==0)cn++;
83 a.cost--;
84 flag[a.cost]++;
85 }
86 if(b.cost>0)
87 {
88 flag[b.cost]--;
89 if(flag[b.cost]==0)cn--;
90 if(flag[b.cost-1]==0)cn++;
91 b.cost--;
92 flag[b.cost]++;
93 }
94 ab[cnt][a.id]++;
95 ab[cnt][b.id]++;
96 }
97 else
98 {
99 ss c = que.top();
100 que.pop();
101 if(a.cost>0)
102 {
103 flag[a.cost]--;
104 if(flag[a.cost]==0)cn--;
105 if(flag[a.cost-1]==0)cn++;
106 a.cost--;
107 flag[a.cost]++;
108 }
109 if(b.cost>0)
110 {
111 flag[b.cost]--;
112 if(flag[b.cost]==0)cn--;
113 if(flag[b.cost-1]==0)cn++;
114 b.cost--;
115 flag[b.cost]++;
116 }
117 if(c.cost>0)
118 {
119 flag[c.cost]--;
120 if(flag[c.cost]==0)cn--;
121 if(flag[c.cost-1]==0)cn++;
122 c.cost--;
123 flag[c.cost]++;
124 }ab[cnt][c.id]++;
125 ab[cnt][a.id]++;
126 ab[cnt][b.id]++;
127 que.push(c);
128 }
129 cnt++;
130 que.push(a);
131 que.push(b);
132 }
133 int x = que.top().cost;
134 printf("%d\n",x);
135 printf("%d\n",cnt);
136 for(i = 0;i < cnt;i++)
137 {
138 for(j = 0;j < n;j++)
139 {
140 if(j == 0)
141 printf("%d",ab[i][j]);
142 else printf("%d",ab[i][j]);
143 }
144 printf("\n");
145 }
146 return 0;
147 }
A. Toda 2的更多相关文章
- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest A. Toda 2 贪心 + 暴力
A. Toda 2 time limit per test 2 seconds memory limit per test 512 megabytes input standard input out ...
- CodeForces 730A Toda 2 (模拟)
题意:给定一个序列,现在你每次至多给5个人的权值减小1,最少2个人,最小是0,使得剩下的所有权值都相等且尽量大. 析:用multiset来模拟,每次取权值最大的三个或者两个,直到最后相等.我开始没有这 ...
- Codeforces 730A:Toda 2(multiset模拟)
http://codeforces.com/problemset/problem/730/A 题意:有n个人打天梯,想让这n个人的分数相同,每场比赛必须有2-5个人参赛,参赛的人会降低一分,问一个合理 ...
- entrar en su zapatilla de deporte en este lugar
Mientras que yo apareció su campo usando nuestro Nike Glide Wildhorse sólo dos ($ 110) zapatillas de ...
- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest
A. Toda 2 按题意模拟即可. #include <bits/stdc++.h> using namespace std ; typedef pair < int , int ...
- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)
A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...
- POJ - 2339 Rock, Scissors, Paper
初看题目时就发了个错误,我因为没有耐心看题而不了解题目本身的意思,找不到做题的突破口,即使看了一些题解,还是没有想到方法. 后来在去问安叔,安叔一语道破天机,问我有没有搞清题目的意思,我才恍然大悟,做 ...
- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 几道简单题的题解
A. Toda 2 题意:给你n个人,每个人的分数是a[i],每次可以从两个人到五个人的使得分数减一,使得最终的分数相等: 思路:假设答案为m:每个人的分数与答案m的差值为d[i],sum为d[i]的 ...
- 有关ListBox
如何拿到Source:从SQL,从XML file SQL:一个是ObjectDataProvider //用linq方法拿到SQL data,wrap到一个IEnumerable<Custom ...
随机推荐
- 『与善仁』Appium基础 — 19、元素定位工具(三)
目录 1.Chrome Inspect介绍 2.Chrome Inspect打开方式 3.Chrome Inspect工具的使用 (1)Chrome Inspect工作前提 (2)Chrome Ins ...
- Hadoop入门 常见错误及解决方案
常见错误及解决方案 目录 常见错误及解决方案 ResourceManager连接失败 root用户和ranan用户两个用户启动集群不统一 不识别主机名 DataNode和NameNode进程同时只能工 ...
- CORS 如果需要指定多个域名怎么办
CORS 通过控制 Access-Control-Allow-Origin 控制哪些域名可以共享资源,取值如下 Access-Control-Allow-Origin: <origin> ...
- 内存管理——new delete expression
C++申请释放内存的方法与详情表 调用情况 1.new expression new表达式在申请内存过程中都发生了什么? 编译器将new这个分解为下面的主要3步代码,①首先调用operator new ...
- 快速上手git gitlab协同合作
简单记录,整理. 摘要 为方便大家快速上手Git,并使用Gitlab协同合作,特编写此手册,手册内容不会太丰富与深入.主要包含如下内容: Git 使用教程1.1 安装1.2 常用命令1.3 版本控制1 ...
- jquery总结和注意事项
1.关于页面元素的引用通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom ...
- ActiveRecord教程
(一.ActiveRecord基础) ActiveRecord是Rails提供的一个对象关系映射(ORM)层,从这篇开始,我们来了解Active Record的一些基础内容,连接数据库,映射表,访问数 ...
- Shell脚本定期清空大于1G的日志文件
一个关于如何在指定文件大于1GB后,自动删除的问题. 批处理代码如下: #!/bin/bash # 当/var/log/syslog大于1GB时 # 自动将其备份,并清空 # 注意这里awk的使用 i ...
- 在html页面通过绝对地址显示图片
1.编辑tomcat中conf目录下的server.xml文件,在<Host></Host>中添加如下代码段 <Context path="/D" d ...
- SOUI3界面编辑器使用说明
SOUI一直没有官方的界面编辑器,关键是我自己一直坚持手写界面更好控制. 大概是2年前,网友"指尖"开发了一个SOUI2的编辑器,功能非常多,特点是可以拖动控件来实现可视化布局. ...