5778. 【NOIP提高A组模拟2018.8.8】没有硝烟的战争

Description
被污染的灰灰草原上有羊和狼。有N只动物围成一圈,每只动物是羊或狼。
该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x+1,x+K]区间的整数,游戏按顺时针方向进行。每只动物报的数字都不能超过M。若一只动物报了M这个数,它所在的种族就输了。问以第i只动物为游戏的开始,最后哪种动物会赢?
 
Input
第一行输入三个正整数N,M,K。
接下来一行N个正整数,分别表示N只动物的种类,以顺时针的方向给出。0代表羊,1代表狼。
 
Output
一行输出N个整数,表示若从第i只动物开始,赢的动物的种类。同上,0代表羊,1代表狼。
 
Solutions

我们可以设 dp[i][j]=0/1 来表示第 i 只动物报的数字是 j,是否有必胜策略。

0 表示没有必胜策略,1 表示有。

边界条件就是 dp[][m]=0 Dp[i][j]怎么求?

假如 i 和 i+1 是同一个种群,那么只需要判断 dp[i+1][j+1…j+k]是否存在必胜策略,如果存在,那么 dp[i][j]=1.

同样的,假如 i 和 i+1 不是同一个种群,那么只需要判 断 dp[i+1][j+1…j+k]是否存在必胜策略,如果存在,那 么 dp[i][j]=0.

判断 dp[i+1][j+1…j+k]是否存在必胜策略,只需要用一 个后缀和辅助即可。

然后对于每一个动物,你只需要知道,dp[i][1…k]是否 有必胜策略就行了。

 

代码

 

 1 var
 2   n,m,k:longint;
 3   a:array [0..5001] of longint;
 4   f,ans:array [0..5001,0..5001] of longint;
 5 function min(o,p:longint):longint;
 6 begin
 7   if o<p then exit(o);
 8   exit(p);
 9 end;
10 
11 procedure init;
12 var
13   i:longint;
14 begin
15   readln(n,m,k);
16   for i:=1 to n do
17     read(a[i]);
18 end;
19 
20 procedure main;
21 var
22   i,j,l:longint;
23 begin
24   fillchar(f,sizeof(f),0);
25   for j:=m-2 downto 0 do
26     for i:=1 to n do
27       begin
28         l:=i+1;
29         if l>n then l:=1;
30         if a[l]=a[i] then
31           begin
32             if ans[l,j+1]-ans[l,min(j+k,m-1)+1]>0 then
33               f[i,j]:=1;
34           end else
35           begin
36             if ans[l,j+1]-ans[l,min(j+k,m-1)+1]<min(j+k,m-1)-(j+1)+1 then
37               f[i,j]:=1;
38           end;
39         ans[i,j]:=ans[i,j+1]+f[i,j];
40       end;
41 end;
42 
43 procedure print;
44 var
45   i:longint;
46 begin
47   for i:=1 to n do
48     if f[i,0]=1 then write(a[i],' ')
49                 else write(a[i] xor 1,' ');
50 end;
51 
52 begin
53   assign(input,'vode.in');
54   assign(output,'vode.out');
55   reset(input);
56   rewrite(output);
57   init;
58   main;
59   print;
60   close(input);
61   close(output);
62 end.

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值