USACO COWRUN 随机化搜索+双重递归调用

题面描述:给出8*N(<=14)组牌,每次按顺序选择8张,FJ可以选择前4张或者后4张,COW从FJ选出的牌中选择前两张或者后两张,然后COW会在环上走\(R \times A+B\),R为已经走的距离,A,B分别为选出的第一张和第二张牌,COW会在长度为M的换上走,要求最终cow,离起点的距离小于等于K,题目给出COW的决策,你要确定FJ的决策,注意由于FJ在COW 之前决策,也就说FJ所选出的决策一定要满足,无论之后COW如何选择,COW都能满足条件,求字典序最小

题目非常巧妙:N很小我们 可以搜索,如何去判断FJ的决策合法:枚举到下一层奶牛选择的两种可能,他们必须都合法,如何验证他们的合法性,分别进入下一层搜索树,只要有一个FJ的决策合法即可

这样做只有80分:数据可能会K你的决策 比如有很多的T

code

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n;
long long m,k;
int aa[20][10];
char s[20];
inline int cal(int pos,long long now,int a,int b){
int temp=4*a+2*b+1;
return (now*(aa[pos][temp]+1)%m+aa[pos][temp+1])%m;
}
inline bool dfs(int pos,long long now,int a);
inline bool efs(int pos,long long now){
if(pos>n)return now<=k || now>=m-k;
return dfs(pos,now,1)||dfs(pos,now,0);
}
inline bool dfs(int pos,long long now,int a){
return efs(pos+1,cal(pos,now,a,1))&&efs(pos+1,cal(pos,now,a,0));
}
int main(){
cin>>n>>m>>k;
scanf("%s",s+1);
for(int i=1;i<=n;++i)
for(int j=1;j<=8;++j)cin>>aa[i][j];
long long now=0;
for(int i=1;i<=n;++i){
if(dfs(i,now,1)){
cout<<"B";
now=cal(i,now,1,s[i]=='B');
}
else {
cout<<"T";
now=cal(i,now,0,s[i]=='B');
}
}
return 0;
}
/*
2 2 0
TT
1 0 0 0 0 0 0 1
0 1 1 1 0 0 1 0
*/

类似TREAP的思想:随机化COW的选择判断答案的合法性不会被数据HACK

code:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
int n;
long long m,k;
int aa[20][10];
char s[20];
inline int cal(int pos,long long now,int a,int b){
int temp=4*a+2*b+1;
return (now*(aa[pos][temp]+1)%m+aa[pos][temp+1])%m;
}//第pos次拿牌,当前位置在now,fj选了a,cow选了b后的位置
inline bool dfs(int pos,long long now,int a);
inline bool efs(int pos,long long now){
if(pos>n)return now<=k || now>=m-k;
int x=rand()&1;
return dfs(pos,now,x)||dfs(pos,now,!x);//个
}//第pos次拿牌,当前位置在now,是否可行,验证就是FJ强制选或强制不选
inline bool dfs(int pos,long long now,int a){
int x=rand()&1;
return efs(pos+1,cal(pos,now,a,x))&&efs(pos+1,cal(pos,now,a,!x));
}//第pos次拿牌,当前位置在now,fj选择a是否可行,验证只需后一个奶牛是否可以随便选
int main(){
cin>>n>>m>>k;
scanf("%s",s+1);
for(int i=1;i<=n;++i)
for(int j=1;j<=8;++j)cin>>aa[i][j];
long long now=0;
for(int i=1;i<=n;++i){
if(dfs(i,now,1)){
cout<<"B";
now=cal(i,now,1,s[i]=='B');
}
else {
cout<<"T";
now=cal(i,now,0,s[i]=='B');
}
}
return 0;
}
/*
2 2 0
TT
1 0 0 0 0 0 0 1
0 1 1 1 0 0 1 0
*/

COWRUN的更多相关文章

  1. USACO翻译:USACO 2012 JAN三题(2)

    USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...

  2. COGS 146. [USACO Jan08] 贝茜的晨练计划

    ★☆   输入文件:cowrun.in   输出文件:cowrun.out   简单对比时间限制:1 s   内存限制:32 MB 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运 ...

  3. noip2018 pre——Dp

    Dp专题 1011: KC的瓷器 (porcelain) 题目描述 KC来到了一个盛产瓷器的国度.他来到了一位商人的店铺.在这个店铺中,KC看到了一个有n(1<=n<=100)排的柜子,每 ...

  4. bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110 传送门2:http://www.lydsy.com/JudgeOn ...

  5. 2016.8.15上午纪中初中部NOIP普及组比赛

    2016.8.15上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1333 这次比赛不怎么好,因为这套题目我并不是很擅长. 可同学们 ...

随机推荐

  1. 洛谷 P2960 [USACO09OCT]Milkweed的入侵Invasion of the Milkweed

    P2960 [USACO09OCT]Milkweed的入侵Invasion of the Milkweed 题目描述 Farmer John has always done his best to k ...

  2. MooseFS源代码分析(二)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  3. vim visual操作备忘

    visual模式下: jkl选中行 "+y 复制选中行

  4. 基于SIP和RTP协议的开源VOIP之QuteCom简单介绍

    **************************************************************************************************** ...

  5. 创建一个Spring的HelloWorld程序

    Spring IOC IOC指的是控制反转,把对象的创建.初始化.销毁等工作都交给Spring容器.由spring容器来控制对象的生命周期.下图能够说明我们传统创建类的方式和使用Spring之后的差别 ...

  6. nj05---模块

    概念:模块(Module)和包(Package)是Node.js最重要的支柱.在浏览器JavaScript中,脚本模块的拆分和组合通常使用HTML的script标签来实现,Node.js提供了requ ...

  7. Android微信智能心跳方案 Android微信智能心跳方案

    原文地址: http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207243549&idx=1&sn=4ebe4beb81 ...

  8. poj_3468,线段树成段更新

    参考自http://www.notonlysuccess.com/index.php/segment-tree-complete/ #include<iostream> #include& ...

  9. Python 标准库 —— 队列(Queue,优先队列 PriorityQueue)

    优先队列,有别于普通队列的先入先出(虽然字面上还是队列,但其实无论从含义还是实现上,和普通队列都有很大的区别),也有别于栈的先入后出.在实现上,它一般通过堆这一数据结构,而堆其实是一种完全二叉树,它会 ...

  10. 38.angular的scope作用域

    转自:https://www.cnblogs.com/best/tag/Angular/ 1. Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带. S ...