Voting CodeForces - 749C
有点意思的题
题意:有n个人投票,每次按照第1个人~第n个人的顺序发言,如果到某个人发言时他已经被禁止发言就跳过,每个人发言时可以禁止另一个人发言或什么也不做。最后只剩下一个人时,那个人的意见就是最终决定的意见。这些人分为D和R两派,也就是每个人有D和R两种意见中的一种,每一派的人都希望自己派的意见成为最终意见。假设每个人都作出最优选择,请根据每个人的派别判断最终决定的意见。
方法:第i个人发言的时候,就按照第i~第n,第1~第i-1的顺序找出第一个出现的与自己不同派别且没有被禁言的人,将其禁言。当只剩下某一派时,显然这一派的意见就是最终意见。
方法虽然简单,但是实现起来会遇到很多困难。
垃圾程序(模拟)1
#include<cstdio>
int type[];
int next1[];//next1[i]表示i之后第一个不同党的位置
int first1[];//first1[i]表示从前数起第一个i的位置
int next2[];//next2[i]表示i之后第一个同党的位置
int temp[];
bool nok[];
int n,now;
int main()
{
int i;
char c;
scanf("%d\n",&n);
for(i=;i<=n;i++)
{
scanf("%c",&c);
if(c=='D')
type[i]=;
else
type[i]=;
}
for(i=n;i>=;i--)
{
next1[i]=temp[type[i]^];
temp[type[i]]=i;
}
for(i=n;i>=;i--)
{
next2[i]=first1[type[i]];
first1[type[i]]=i;
}
now=n;
while(true)
{
for(i=;i<=n;i++)
{
if(nok[i]) continue;
if(now==)
{
if(type[i]==)
printf("D");
else
printf("R");
return ;
}
while(nok[next1[i]]==true) next1[i]=next2[next1[i]];
while(nok[first1[i]]==true) first1[i]=next2[next1[i]];
if(next1[i])
{
nok[next1[i]]=true;
next1[i]=next2[next1[i]];
}
else if(first1[type[i]^])
{
nok[first1[type[i]^]]=true;
first1[type[i]^]=next2[first1[type[i]^]];
}
else
{
if(type[i]==)
printf("D");
else
printf("R");
return ;
}
}
}
return ;
}
垃圾程序(模拟)2
#include<cstdio>
int type[];
int next1[];//next1[i]表示i之后第一个不同党的位置
int first1[];//first1[i]表示从前数起第一个i的位置
int next2[];//next2[i]表示i之后第一个同党的位置
int temp[];
bool nok[];
int n,now;
int main()
{
int i;
char c;
scanf("%d\n",&n);
for(i=;i<=n;i++)
{
scanf("%c",&c);
if(c=='D')
type[i]=;
else
type[i]=;
}
for(i=n;i>=;i--)
{
next1[i]=temp[type[i]^];
temp[type[i]]=i;
}
for(i=n;i>=;i--)
{
next2[i]=first1[type[i]];
first1[type[i]]=i;
}
now=n;
while(true)
{
for(i=;i<=n;i++)
{
if(nok[i]) continue;
if(now==)
{
if(type[i]==)
printf("D");
else
printf("R");
return ;
}
while(nok[next1[i]]==true) next1[i]=next2[next1[i]];
while(nok[first1[i]]==true) first1[i]=next2[first1[i]];
if(next1[i])
{
nok[next1[i]]=true;
now--;
next1[i]=next2[next1[i]];
}
else if(first1[type[i]^])
{
nok[first1[type[i]^]]=true;
now--;
first1[type[i]^]=next2[first1[type[i]^]];
}
else
{
if(type[i]==)
printf("D");
else
printf("R");
return ;
}
}
}
return ;
}
后来看了题解,发现可以用三个队列按照(i~n,1~i-1)的顺序分别存储(所有的,与当前人同派的,与当前人异派的)且未被禁言的人的序号
然后,又炸了两次...所以要小心
//第i个人按照先i到n,再1到i-1的顺序找出第一个不同派别的deny
#include<cstdio>
#include<queue>
using namespace std;
bool type[];
bool deny[];
queue<int> q[],q2;
int n;
int main()
{
int i,now,now2;
char c;
scanf("%d\n",&n);
for(i=;i<=n;i++)
{
scanf("%c",&c);
if(c=='R')
type[i]=;
q[type[i]].push(i);
q2.push(i);
}
while(!q[].empty()&&!q[].empty())
{
now=q2.front();
q2.pop();
if(deny[now]) continue;
//此时now就为当前要发言的(未被禁言的)人
now2=q[type[now]^].front();//now要禁言的人
q[type[now]^].pop();//由于now2被禁言,就不放回队列了
deny[now2]=true;
q[type[now]].pop();//第二次交加上的,now已经发完言,从队列中退出
q[type[now]].push(now);//第三次交加上的,并放回到队列尾部
q2.push(now);
}
if(q[].empty())
printf("R");
else
printf("D");
return ;
}
Voting CodeForces - 749C的更多相关文章
- Voting CodeForces - 749C (set,模拟)
大意: n个人, 两个党派, 轮流投票, 两种操作(1)ban掉一个人 (2)投票, 每轮一个未被ban的人可以进行一次操作(1)或操作(2), 求最终哪个党派得票最多. 显然先ban人会更优, 所以 ...
- Codeforces 749C. Voting 模拟题
C. Voting time limit per test: 1 second memory limit per test: 256 megabytes input: standard input o ...
- Codeforces 749C:Voting(暴力模拟)
http://codeforces.com/problemset/problem/749/C 题意:有n个人投票,分为 D 和 R 两派,从1~n的顺序投票,轮到某人投票的时候,他可以将对方的一个人K ...
- CodeForces - 749C Voting
C. Voting time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...
- Codeforces 749C【模拟】
FST的时候好像挂了挺多人的~ 其实思路没啥难的,就是更好地理解题意吧,1到n一直循环,直到没有人能vote,一个人能vote也能叉掉一个人,一个人被叉就不能vote,判谁赢. 其实我管vote干嘛, ...
- codeforces 637A A. Voting for Photos(水题)
题目链接: A. Voting for Photos time limit per test 1 second memory limit per test 256 megabytes input st ...
- Codeforces 1251E Voting
E2. Voting (Hard Version) 题意: 有n个人, 你想让他们都给你投票. 你可以选择花费pi收买第i个人, 或者如果有mi个人已经给你投票了, 那么第i个人会自动给你投票. 不妨 ...
- codeforces#1251E2. Voting (Hard Version)(贪心)
题目链接: http://codeforces.com/contest/1251/problem/E2 题意: 主角需要获得n个人的投票 有两种方式让某个人投票 1,已经投票的人数大于m 2,花p枚硬 ...
- Codeforces Round #388 (Div. 2) C. Voting
题意:有n个人,每个人要么是属于D派要么就是R派的.从编号1开始按顺序,每个人都有一次机会可以剔除其他任何一个人(被剔除的人就不在序列中也就失去了剔除其他人的机会了):当轮完一遍后就再次从头从仅存的人 ...
随机推荐
- android studio 非法字符: '\ufeff' 解决方式
今天发现一个问题,就是从其它地方拷贝的代码到AS项目里面,木有语法 错误,可是就是执行不起来,老是报错"非法字符: '\ufeff' ",郁闷非常久.木有看到这个字符.最后查询了这 ...
- Java 线程池ThreadPoolExecutor简单应用
什么是线程池: 线程池就是控制线程的一个池子.用来控制线程数量. 为什么要使用线程池: 1.避免系统反复创建和销毁线程影响执行的时间(创建+销毁>>执行时间时) 2.控制线程数量.线程过多 ...
- 备忘录模式-Memento
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 备忘录模式结构图: 何时使用备忘录模式: Memento模式比适合 ...
- 倒排索引 获取指定单词的文档集合 使用hash去重单词term 提高数据压缩率的方法
倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inve ...
- 手游服务器php架构比较
从swoole项目开始到现在,一直有人在问这个问题.今天来抽空讲一下它.为什么swoole非要使用纯C来写而不是PHP代码来实现,核心的原因有2点: 1. PHP无法直接调用操作系统API 如send ...
- TCO 2016 Round 1B
problem 250 Problem Statement Vasa likes to construct sequences of numbers. If you tell him a positi ...
- [RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】
本文转载自:http://m.blog.csdn.net/kris_fei/article/details/69553422 Platform: ROCKCHIPOS: Android 6.0Kern ...
- POJ 1861 Network (Kruskal算法+输出的最小生成树里最长的边==最后加入生成树的边权 *【模板】)
Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14021 Accepted: 5484 Specia ...
- FZU1686 神龙的难题 —— Dancing Links 可重复覆盖
题目链接:https://vjudge.net/problem/FZU-1686 Problem 1686 神龙的难题 Accept: 812 Submit: 2394 Time Limit: ...
- 计算机学院大学生程序设计竞赛(2015’12)Study Words
Study Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...