CodeForces - 730A 贪心+模拟
贪心策略:
1、只有一个最大值,选着第二大的一起参加比赛减分。
2、有奇数个最大值,选择三个进行比赛。
3、偶数个最大值,选择两个进行比赛。
为什么不把最大值全部选择?
因为最多只能选五个,有可能选择完五个只剩下一个最大值,那么就会进行贪心策略1,会出错。
AC代码:
#include<cstdio>
#include<set>
using namespace std;
const int maxn=1e4+1;
char ans[maxn][101];
int cnt=0,n;
struct node{
int ind;
int val;
node(){}
node(int i,int v):ind(i),val(v){}
bool operator < (const node &p)const{
return val>p.val;
}
}score[105];
multiset<node>ss;
typedef multiset<node>::iterator iter;
inline int counter(){ //相同最大值的个数
int key=(ss.begin())->val;
int cntt=0;
for(iter c=ss.begin();c!=ss.end();++c){
if(c->val==key) ++cntt;
else break;
}
return cntt;
}
inline void deal(int k,int *a){
for(int i=0;i<k;++i){
if(score[a[i]].val>0) score[a[i]].val-=1;
ss.insert(score[a[i]]);
}
for(int i=0;i<n;++i){
int ok=0;
for(int j=0;j<k;++j)
if(a[j]==i) {ok=1;break;}
if(ok) ans[cnt][i]='1';
else ans[cnt][i]='0';
}
cnt++;
}
//模拟
void solve(){
int cnt=counter();
if(cnt==n) return;
int k=0,a[5];
if(cnt==1||cnt%2==0) {
iter c=ss.begin();
a[k++]=c->ind;
ss.erase(c);
c=ss.begin();
a[k++]=c->ind;
ss.erase(c);
deal(k,a);
}
else if(cnt>1&&cnt&1){
iter c=ss.begin();
a[k++]=c->ind;
ss.erase(c);
c=ss.begin();
a[k++]=c->ind;
ss.erase(c);
c=ss.begin();
a[k++]=c->ind;
ss.erase(c);
deal(k,a);
}
solve();
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d",&score[i].val);
score[i].ind=i;
ss.insert(score[i]);
}
solve();
printf("%d\n",(ss.begin())->val);
printf("%d\n",cnt);
for(int i=0;i<cnt;++i)
printf("%s\n",ans[i]);
return 0;
}
昨晚我又想了下,其实还有一种直观贪心:
1、只有一个最大值,选择最大和第二大进行比赛。
2、如果有6个最大值,选择4个比赛。不能选5个,因为一定要把所有最大值同时处理掉。
3、如果最大值大于6,选择5个比赛。
4、其他大于1小于等于5的情况,就全部选择参加比赛
AC代码:
#include<cstdio>
#include<set>
using namespace std;
const int maxn=1e4+1;
char ans[maxn][101];
int cnt=0,n;
struct node{
int ind;
int val;
node(){}
node(int i,int v):ind(i),val(v){}
bool operator < (const node &p)const{
return val>p.val;
}
}score[105];
multiset<node>ss;
typedef multiset<node>::iterator iter;
inline int counter(){ //相同最大值的个数
int key=(ss.begin())->val;
int cntt=0;
for(iter c=ss.begin();c!=ss.end();++c){
if(c->val==key) ++cntt;
else break;
}
return cntt;
}
inline void deal(int k,int *a){
for(int i=0;i<k;++i){
if(score[a[i]].val>0) score[a[i]].val-=1;
ss.insert(score[a[i]]);
}
for(int i=0;i<n;++i){
int ok=0;
for(int j=0;j<k;++j)
if(a[j]==i) {ok=1;break;}
if(ok) ans[cnt][i]='1';
else ans[cnt][i]='0';
}
cnt++;
}
//模拟
void solve(){
int cntt=counter();
if(cntt==n) return;
int k=0,a[5];
if(cntt==6) cntt=4;
else if(cntt>=7) cntt=5;
else if(cntt==1) cntt=2;
for(int i=0;i<cntt;++i){
iter c=ss.begin();
a[k++]=c->ind;
ss.erase(c);
}
deal(k,a);
solve();
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d",&score[i].val);
score[i].ind=i;
ss.insert(score[i]);
}
solve();
printf("%d\n",(ss.begin())->val);
printf("%d\n",cnt);
for(int i=0;i<cnt;++i)
printf("%s\n",ans[i]);
return 0;
}
如有不当之处欢迎指出!
CodeForces - 730A 贪心+模拟的更多相关文章
- Population Size CodeForces - 416D (贪心,模拟)
大意: 给定$n$元素序列$a$, 求将$a$划分为连续的等差数列, 且划分数尽量小. $a$中的$-1$表示可以替换为任意正整数, 等差数列中必须也都是正整数. 贪心策略就是从前到后尽量添进一个等差 ...
- Arthur and Questions CodeForces - 518E (贪心模拟)
大意: 给定序列$a$, 某些位置为'?', 求给'?'赋值使得序列$(a_1+a_2+...+a_k,a_2+a_3+...+a_{k+1},...)严格递增, 且$\sum|a_i|$最小. 化简 ...
- Codeforces 1042C (贪心+模拟)
题面 传送门 分析 思路简单,但代码较复杂的贪心 分类讨论: 有0 负数有奇数个:将绝对值最小(实际最大)的负数和0全部乘到一起,最后删掉0 负数有偶数个:将0全部乘到一起,最后删掉0 没有0 负数有 ...
- Sums of Digits CodeForces - 509C (贪心,模拟)
大意: 一个未知严格递增数组$a$, 给定每个数的数位和, 求$a[n]$最小的数组$a$ #include <iostream> #include <algorithm> # ...
- Music in Car CodeForces - 746F (贪心,模拟)
大意: n首歌, 第$i$首歌时间$t_i$, 播放完获得贡献$a_i$, 最多播放k分钟, 可以任选一首歌开始按顺序播放, 最多选w首歌半曲播放(花费时间上取整), 求贡献最大值. 挺简单的一个题, ...
- 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts
题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...
- CodeForces ---596B--Wilbur and Array(贪心模拟)
Wilbur and Array Time Limit: 2000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Su ...
- 贪心+模拟 ZOJ 3829 Known Notation
题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...
- Largest Beautiful Number CodeForces - 946E (贪心)
大意: 定义一个好数为位数为偶数, 且各位数字重排后可以为回文, 对于每个询问, 求小于$x$的最大好数. 假设$x$有$n$位, 若$n$为奇数, 答案显然为$n-1$个9. 若为偶数, 我们想让答 ...
随机推荐
- 《UNIX实用教程》读书笔记
原著:<Just Enough UNIX> Fifth Edition [美]Paul K.Andersen 译著:<UNIX实用教程> 第5版 宋虹 曾庆冬 段桂华 杨路 ...
- Servlet开篇
Servlet开篇 前面我已经说过好多遍了,如何学习好一个东西其实就是2个问题: 1,这个东西是干嘛的?为什么要玩这个东西? 2,怎么样就玩好这个东西了?具体的应该玩这个东西的什么? 其实现在对于我来 ...
- 在Tomcat中实现基本的HTTP方式的验证
.实现基本验证 (1)在C:\jakarta-tomcat-5.0.19\conf下的tomcat-users.xml文件中添加角色和用户(可以同时添加多个用户) <role rolename= ...
- linkin大话设计模式--桥接模式
linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...
- MYSQL导入大量数据碰到的问题及解决方法
在项目中,经常会碰到往数据库中导入大量数据,以便利用sql进行数据分析.在导入数据的过程中会碰到一些需要解决的问题,这里结合导入一个大约4G的txt数据的实践,把碰到的问题以及解决方法展现出来,一方面 ...
- 计算器(Ext)
<html> <head> <title>计算器</title> <meta charset="UTF-8"> < ...
- ecplise最有用的8个快捷键
1. ctrl+shift+r 打开资源 这组快捷键可以让你打开你工作区中的任何一个文件.而你只需要按下键盘的文件名或前几个字母 美中不足的是这组快捷键并非在所有视图下都能用. 2.ctrl+o:快速 ...
- 理解Object.defineProperty的作用
对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...
- C# 关键字--virtual(转)
C# 关键字--virtual 一. virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写.虚拟成员的实现可由派生类中的重写成员更改,而非虚拟成员是无法由派生类 ...
- CSS初了解
1.在网页中, html负责的是一个页面的结构 css(层叠式表)是网页中的数据样式 2.编写css代码方式: A: 在style标签中编写代码,只能用在本页面中,复用性不强. 格式:<styl ...