有点意思的题

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. (Android 即时通讯) [悬赏],不管是谁发现一个漏洞奖励人民币1000元!

    悬赏,不管是谁发现一个漏洞奖励人民币1000元! 3Q Android 手机版即时通讯系统正式推出,可与电脑版 地灵(http://im.yunxunmi.com) 即时通讯系统互通!  适用于:小米 ...

  2. 设计模式学习笔记——Mediator中介者模式

    将众多对象之间的网状关系转为全部通过一个中间对象间接发生关系,此中间对象为中介者. 看图最直观: 作用不言而喻,就是降低对象之间的耦合度,乃至降低了整个系统的复杂度. 有点象代理模式,更象外观模式:

  3. HBase运维基础--元数据逆向修复原理

    背景 鉴于上次一篇文章——“云HBase小组成功抢救某公司自建HBase集群,挽救30+T数据”的读者反馈,对HBase的逆向工程比较感兴趣,并咨询如何使用相应工具进行运维等等.总的来说,就是想更深层 ...

  4. SignatureDoesNotMatch REST接口 在任何时间、任何地点、任何互联网设备上 在Header中包含签名

    PutObject_关于Object操作_API 参考_对象存储 OSS-阿里云 https://help.aliyun.com/document_detail/31978.html OSS API ...

  5. HDU 5627Clarke and MST

    Clarke and MST Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  6. 关于谷歌浏览器默认字体12px的解决方案

    1. * Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示, 可通过加入 CSS 属性 -webkit-text-size-adjust: none; 解决. 超链接访问 ...

  7. xunit inlinedata classdata memberdata

    https://andrewlock.net/creating-parameterised-tests-in-xunit-with-inlinedata-classdata-and-memberdat ...

  8. 在织梦dedecms中实现“文章标题-栏目名称-网站名”导航

    本文介绍了在dedecms中,实现文章标题-栏目名称-网站名 导航的方法,有需要的朋友参考下. 在dedecms中实现“文章标题-栏目名称-网站名”导航的方法.   第一种: 在/include/in ...

  9. tuple built-in function

    tuple tips: 1.对于Python中的tuple类型来说,他与其它的序列类型来讲最大的不同就是tuple是不可变的. 2.当你需要创建一个只有一个元素的tuple时,需要在元祖分隔符里面加一 ...

  10. BZOJ_1406_[AHOI2007]密码箱_枚举+数学

    BZOJ_1406_[AHOI2007]密码箱_枚举+数学 Description 在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子 ...