The 2020 ICPC Asia Shenyang Regional Programming Contest D题 Journey to Un‘Goro(搜索剪枝)

本文主要是介绍The 2020 ICPC Asia Shenyang Regional Programming Contest D题 Journey to Un‘Goro(搜索剪枝),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

The 2020 ICPC Asia Shenyang Regional Programming Contest D题

在这里插入图片描述
题意就不多加赘述了。首先我们可以知道全为rrrrr的情况可以很快的算出题意中的最大满意度。那么我们如何来构造前100小的字典序序列呢?

错误思路:
一开始我觉得肯定是brbrbr
*序列 然后从后往前翻转br emmmm搞了一段时间发现错了((显然 。

通过暴力打表发现,每种合法的方案中r,b都有数量限制。任何一方的数量超过了限制都不可取。记限制Lim=(n+1)-(n+1)/2 就类似于任何一方至多只能是N/2+1 有了这个限制可以在爆搜的时候节约很多没必要的搜索。
如何考虑最小字典序呢? 显然,一开始尽量放b的搜索即可。另一个trik就是两个相邻且相同的数,我们应该放置它为b,否则放置r。一开始在序列中插入一个0,每次dfs记录长度和 0,1的个数,优先放与上一个状态结尾一样的数字,即优先保证字典序最小。注意一开始0的数量为1 .

总结:思维能力是真的很重要


vector<ll>s= {0};
ll lim;
ll n;
ll op=0;
void dfs(ll cnt,ll cnt0,ll cnt1)
{if(cnt0>lim||cnt1>lim)return ;if(cnt==n){for(int i=1; i<=n; i++){if(s[i]==s[i-1])printf("b");elseprintf("r");}op++;printf("\n");return ;}ll vis=s[cnt];if(vis==0){s.push_back(0);dfs(cnt+1,cnt0+1,cnt1);s.pop_back();if(op==100)return;s.push_back(1);dfs(cnt+1,cnt0,cnt1+1);s.pop_back();if(op==100)return ;}else{s.push_back(1);dfs(cnt+1,cnt0,cnt1+1);s.pop_back();if(op==100)return;s.push_back(0);dfs(cnt+1,cnt0+1,cnt1);s.pop_back();if(op==100)return ;}
}
signed main()
{read(n);lim=(n+1)-(n+1)/2;if(n==1){printf("1\n");printf("r");return 0;}ll ans=0;for(int i=1; i<=n; i++){ans++;ll le=n-i;ans=ans+le/2;}printf("%lld\n",ans);dfs(0,1,0);
}

这篇关于The 2020 ICPC Asia Shenyang Regional Programming Contest D题 Journey to Un‘Goro(搜索剪枝)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/771854

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;