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开始按顺序,每个人都有一次机会可以剔除其他任何一个人(被剔除的人就不在序列中也就失去了剔除其他人的机会了):当轮完一遍后就再次从头从仅存的人 ...
随机推荐
- Vs2012在Linux开发中的应用(6):改写Makefile项目的Build过程
MSBUILD的编译过程实际上是依据一系列的targets文件定义的.当我们在IDE运行生成.批生成.清理命令的时候.VS会查找这些命令相应的Task并运行它,以下我们逐个分析这个过程. 当运行生成操 ...
- EF中 Code-First 方式的数据库迁移
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...
- 基于node+koa2+mongodb实现简单的导航管理系统
基于node+koa2+mongodb实现简单的导航管理系统 项目说明 本项目gitbub地址 https://github.com/xuess/nav-admin,喜欢请star 基于node 实现 ...
- 1250太小了 mysql 并发
SHOW VARIABLES LIKE '%connection%'; character_set_connection utf8mb4collation_connection utf8mb4_gen ...
- (linux)MMC 卡驱动分析
最近花时间研究了一下 MMC 卡驱动程序,开始在网上找了很多关于 MMC 卡驱动的分析文章,但大都是在描述各个层,这对于初学者来讲帮助并不大,所以我就打算把自己的理解写下来,希望对大家有用.个人觉得理 ...
- TTL以及LVDS接口传输【转】
本文转载自:http://blog.csdn.net/jscese/article/details/16860833 TTL接口:属于并行方式传输数据的接口,采用这种接口时,不必在液晶显示器的驱动板端 ...
- poj 1258 Agri-Net 解题报告
题目链接:http://poj.org/problem?id=1258 题目意思:给出 n 个 farm,每个farm 之间通过一定数量的fiber 相连,问使得所有farm 直接或间接连通的 最少 ...
- POJ-3352 Redundant Paths
In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) t ...
- Android Studio自动生成带系统签名的apk
介绍签名的两种方式: 1.signapk.jar命令行方式: 如果你需要开发一个带有系统权限的app,往往需要配置SharedUserId,比如: </pre><pre name=& ...
- 学习笔记::kmp
matrix67 nxt[i]:[1-i]中最长公共前后缀的长度 j=0;;i<=n;i++) { ]) j=nxt[j]; ]) j++; nxt[i]=j; }