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 ...
随机推荐
- mysql order by 多个字段排序实现组内排序
总结:大组在前,小组在后,计量值再最后,即可实现组内排序:下边是参考别人的具体实例: 工作中需用到order by 后两个字段排序,但结果却产生了一个Bug,以此备录. [1]复现问题场景 为了说明问 ...
- 用C语言的LED实验,有汇编哦!
C语言LED实验 1.汇编激活CPU 首先要明白对于没有系统开发板(也就是裸机)来说,是没办法直接对C进行识别.所以需要一段汇编语言,来配置CPU的资源,选择CPU运行模式,初始化指针位置. 代码如下 ...
- DOTA数据集
航拍图像面临的问题 正常图像受重力作用相对固定,航拍图像的物体受拍摄角度影响 航拍图像的物体比例变化很大 某些航拍图像中小物体很密集 传统的数据集面临数据偏差的问题严重 好的数据集必备的几个特征 大量 ...
- [源码解析] PyTorch分布式优化器(2)----数据并行优化器
[源码解析] PyTorch分布式优化器(2)----数据并行优化器 目录 [源码解析] PyTorch分布式优化器(2)----数据并行优化器 0x00 摘要 0x01 前文回顾 0x02 DP 之 ...
- day32 HTML
day32 HTML 什么是前端 只要是跟用户打交道的界面都可以称之为前端 # eg:电脑界面, 手机界面,平板界面, 什么是后端? eg:python, java,php,go, 不跟用户直接打交道 ...
- MySQL 迁移到 Redis 记
前些日子,一个悠闲又不悠闲的下午,我还在用 Node.js 写着某个移动互联网应用的 API 服务端.那时还是用 MySQL 作为数据库,一切都很好,所有功能正常运行.可是有很多问题让人不安: 频繁的 ...
- Linux基础命令---vmstat显示虚拟内存状态
vmstat vmstat指令用来显示虚拟内存使用状态,同时也可以显示进程.cpu活动情况.vmstat报告有关进程.内存.分页.块IO.陷阱和CPU活动的信息.生成的第一份报告给出了自上次重新启动以 ...
- Linux:cp -rp
cp -rp[原文件或目录] [目标文件或目录] -r 复制目录 - p 保留文件属性 范例: cp -r /yy/k /yy/u /mm 复制目录u和目录k到目录mm中 cp -r /yy/ ...
- Linux下部署Java项目(jetty作为容器)常用脚本命令
startup.sh #!/bin/bash echo $(basename $(pwd)) "jetty started" cd jetty nohup java -Xmx8g ...
- 基于Annotation(注解)的装配
一.常用注解 1.@Component 是一种通用注解,可用于任何Bean 2.@Repository 通常用于注解DAO层类,即持久层 3.@Service 通常用于注解Service类,即服务层 ...