有点意思的题

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的更多相关文章

  1. Voting CodeForces - 749C (set,模拟)

    大意: n个人, 两个党派, 轮流投票, 两种操作(1)ban掉一个人 (2)投票, 每轮一个未被ban的人可以进行一次操作(1)或操作(2), 求最终哪个党派得票最多. 显然先ban人会更优, 所以 ...

  2. Codeforces 749C. Voting 模拟题

    C. Voting time limit per test: 1 second memory limit per test: 256 megabytes input: standard input o ...

  3. Codeforces 749C:Voting(暴力模拟)

    http://codeforces.com/problemset/problem/749/C 题意:有n个人投票,分为 D 和 R 两派,从1~n的顺序投票,轮到某人投票的时候,他可以将对方的一个人K ...

  4. CodeForces - 749C Voting

    C. Voting time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

  5. Codeforces 749C【模拟】

    FST的时候好像挂了挺多人的~ 其实思路没啥难的,就是更好地理解题意吧,1到n一直循环,直到没有人能vote,一个人能vote也能叉掉一个人,一个人被叉就不能vote,判谁赢. 其实我管vote干嘛, ...

  6. codeforces 637A A. Voting for Photos(水题)

    题目链接: A. Voting for Photos time limit per test 1 second memory limit per test 256 megabytes input st ...

  7. Codeforces 1251E Voting

    E2. Voting (Hard Version) 题意: 有n个人, 你想让他们都给你投票. 你可以选择花费pi收买第i个人, 或者如果有mi个人已经给你投票了, 那么第i个人会自动给你投票. 不妨 ...

  8. codeforces#1251E2. Voting (Hard Version)(贪心)

    题目链接: http://codeforces.com/contest/1251/problem/E2 题意: 主角需要获得n个人的投票 有两种方式让某个人投票 1,已经投票的人数大于m 2,花p枚硬 ...

  9. Codeforces Round #388 (Div. 2) C. Voting

    题意:有n个人,每个人要么是属于D派要么就是R派的.从编号1开始按顺序,每个人都有一次机会可以剔除其他任何一个人(被剔除的人就不在序列中也就失去了剔除其他人的机会了):当轮完一遍后就再次从头从仅存的人 ...

随机推荐

  1. Arcgis Engine(ae)接口详解(7):地图(map)操作

    IMap map = null; //跟map同一层次的activeView对象,他们都是“地图”的对象,map管理地图内容,activeView管理显示内容 IActiveView activeVi ...

  2. 0mq

  3. sbt is a build tool for Scala, Java, and more

    http://www.scala-sbt.org/0.13/docs/index.html sbt is a build tool for Scala, Java, and more. It requ ...

  4. sqlldr trailing nullcols

    由于要导入到tmp_content表的一些列(列:要导入的源文件txt or csv文件)为空,也,按理讲我当时另存为(在windows处理)csv,以,分隔.就是这个列没有内容,也该显示, ,之类的 ...

  5. web 前端冷知识

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

  6. POJ 1737 Connected Graph(高精度+DP递推)

    题面 \(solution:\) 首先做个推销:带负数的压位高精度(加减乘+读写) 然后:由 \(N\) 个节点组成的无向图的总数为: \(2^{N*(N-1)/2}\) (也就是说这个图总共有 \( ...

  7. Java代理(Aop实现的原理)

    经过大牛同事的一句指点立马明确的代理实现方式,Spring Aop应该也是这么去做的.直接上代码 实如今Car的run方法之前调用star方法,在run方法之后调用stop方法. Car类 packa ...

  8. searchkick HasMany Associations | index related model fields

    Project < ActiveRecord::Base searchkick has_many :categories_has_projects has_many :categories, t ...

  9. java 获取时间戳

    //java 获取时间戳 long currentTime=System.currentTimeMillis();

  10. Mysql常见函数

    一.单行函数 1.字符函数 concat拼接 substr截取子串 upper转换成大写 lower转换成小写 trim去前后指定的空格和字符 ltrim去左边空格 rtrim去右边空格 replac ...