有点意思的题

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 ;
}

最新文章

  1. C#回顾 - 7.如何使用反射实现工厂模式?
  2. windows计划任务+批处理文件实现oracle数据库的定时备份与恢复
  3. wine
  4. 第七篇 Replication:合并复制-订阅
  5. 聚合函数字段注意.where和having的区别
  6. [Everyday Mathematics]20150203
  7. 深度优先算法DFS
  8. js获取get方式提交的参数返回json格式数据
  9. Hadoop-MapReduce之自定义数据类型
  10. ios sourecTree
  11. CJOJ 2171 火车站开饭店(树型动态规划)
  12. MySQL(六)之MySQL常用操作符
  13. 从PRISM开始学WPF(八)導航Navigation?
  14. 练习使用 __attribute__ 属性(仿照内核)
  15. 【转】OJ提交时G++与C++的区别
  16. DOM操作的概念
  17. 史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官
  18. python自动化运维笔记3 —— dns处理模块dnspython
  19. Python2.6 升级2.7
  20. PAT 乙级 1026 程序运行时间(15) C++版

热门文章

  1. Android - 监听Activity点击无效
  2. Understanding When to use RabbitMQ or Apache Kafka Kafka RabbitMQ 性能对比
  3. dataTables-details 1.9
  4. Android Studio解决导入项目非常慢
  5. android checkbox radiogroup optionmenu dialog
  6. activity四种状态
  7. FAT和FAT32文件系统的原理
  8. Codeforces Round #106 (Div. 2) D. Coloring Brackets —— 区间DP
  9. kentico检查当前授权用户,是否为admin角色
  10. 目录操作(PHP)