#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cstdio>
using namespace std; const int maxn = + ;
const int maxP = + ;
struct Predict {
int nPre; //n个预测
int rSort[maxn]; //n个人编号相对排序
int isOk; //正确否
} pre[maxn]; //围观人的预测 int n, m; //运动员n,围观人m
int ans; //预测的可能数
int predict[maxP][maxn];//正确的排名
int pre_o[maxn]; //一次正确的排名
bool used[maxn]; //标志数组
void input(); //输入
bool check();
void DFS(int n);
void solve(); //输入
void input()
{
memset(used, , sizeof(used));
scanf("%d%d", &n, &m);
for (int i = ; i < m; i++) {
scanf("%d", &pre[i].nPre);
for (int j = ; j < pre[i].nPre; j++) {
scanf("%d", &pre[i].rSort[j]);
}
scanf("%d", &pre[i].isOk);
}
} bool check()
{
bool flag_1 = true,
flag_2 = true;
for (int i = ; i < m; i++)
{
//预测正确 且 标志是正确标志
if (pre[i].isOk && flag_1)
{
int j = ; //代表预测数的索引
//k--运动员总数
for (int k = ; j < pre[i].nPre && k < n; k++) //k代表第几个选手
{
//预测位置 == 运动员正确位置
if (pre[i].rSort[j] == pre_o[k]) {
j++;
}
}
if (j < pre[i].nPre) { //有位置不等于正确排序 (pre_o和正确的预测不一致,则false)
flag_1 = false;
}
}
else
{
int j = ;
for (int k = ; j < pre[i].nPre && k < n; k++)
{
if (pre[i].rSort[j] == pre_o[k]) {
j++;
}
}
if (j == pre[i].nPre) { //pre_o和不正确的预测一致,所以也应该是false
flag_2 = false;
}
}
if (!flag_1 || !flag_2) break; //有一个错误即错误
}
if (flag_1 && flag_2) return true;
else return false;
} //超时???
void DFS(int cur)
{
if (cur == n && check()) //结束条件
{
for (int i = ; i < n; i++) { //用dfs,亦是 所有排名按字典序依次输出。
predict[ans][i] = pre_o[i]; //每种可能下的,排名
}
ans++; //方案数++
}
//当前人小于参赛总数
if (cur < n)
{
for (int i = ; i < n; i++)
{
if (!used[i]) //判断当前人是否排序过
{
pre_o[cur] = i; //设置当前预测
used[i] = true; //当前人标志为访问过
DFS(cur + ); //下一个人
used[i] = false; //重新标志为false
}
}
}
} void DFS_2(int n) //用STL的话,全排列这段代码就够了
{
for (int i = 0; i < n; i++) pre_o[i] = i;
do {
if (check()) {
for (int i = 0; i < n; i++) {
predict[ans][i] = pre_o[i];
}
ans++;
}
} while (next_permutation(pre_o, pre_o + n));
} //处理函数
void solve()
{
input();
// DFS(0);
DFS_2(n);
printf("%d\n", ans);
for (int i = ; i < ans; i++)
{
printf("%d", predict[i][]);
for (int j = ; j < n; j++) { //n个运动员的排名
printf(" %d", predict[i][j]);
}
printf("\n");
}
} int main()
{
solve();
return ;
}

//一开始使用了自己写的全排列,然后对排列进行check判断,超时了.....

//然后使用了 STL里的 next_permutation(a, a + n) 然后才过

套路总结:

1. 第一步还是先写下面模板

const int maxn =  + ;
const int maxP = + ;
struct Predict {
int nPre; //n个预测
int rSort[maxn]; //n个人编号相对排序
int isOk; //正确否
} pre[maxn]; //围观人的预测 int n, m; //运动员n,围观人m
int ans; //预测的可能数
int predict[maxP][maxn];//正确的排名
int pre_o[maxn]; //一次正确的排名
bool used[maxn]; //标志数组
void input(); //输入
bool check(); //发现check()是DFS水题里面最重要的一步了!!几乎这个能想出来,整个题目就差不多了
void DFS(int n); //自己写的全排列....超时了......
void DFS_2(int n); //next_permutation()
void solve();

//下对check进行分析

//主要就是全排列0~n-1的可能,然后用预测的结果与其比较

//预测正确, 则看是否全排列等于该预测结果,不 一致,则该排列不正确, return false

//预测错误, 则看是否全排列等于该预测结果, 一致,   则该排列不正确, return false

//check()返回true, 则应该将预测结果添加到总的predict[ans][i]中, (结果数)ans++;

bool check()
{
bool flag_1 = true,
flag_2 = true;
for (int i = ; i < m; i++)
{
//预测正确 且 标志是正确标志
if (pre[i].isOk && flag_1)
{
int j = ; //代表预测数的索引
//k--运动员总数
for (int k = ; j < pre[i].nPre && k < n; k++) //k代表第几个选手
{
//预测位置 == 运动员正确位置
if (pre[i].rSort[j] == pre_o[k]) {
j++;
}
}
if (j < pre[i].nPre) { //有位置不等于正确排序 (pre_o和正确的预测不一致,则false)
flag_1 = false;
}
}
else
{
int j = ;
for (int k = ; j < pre[i].nPre && k < n; k++)
{
if (pre[i].rSort[j] == pre_o[k]) {
j++;
}
}
if (j == pre[i].nPre) { //pre_o和不正确的预测一致,所以也应该是false
flag_2 = false;
}
}
if (!flag_1 || !flag_2) break; //有一个错误即错误
}
if (flag_1 && flag_2) return true;
else return false;
}

蓝桥杯 算法提高 3000米排名预测 DFS 递归搜索 next_permutation()使用的更多相关文章

  1. Java实现 蓝桥杯VIP 算法提高 3000米排名预测

    算法提高 3000米排名预测 时间限制:1.0s 内存限制:256.0MB 问题描述 3000米长跑时,围观党们兴高采烈地预测着最后的排名.因为他们来自不同的班,对所有运动员不一定都了解,于是他们分别 ...

  2. 蓝桥杯--算法提高 排列数 (简单dfs)

    算法提高 排列数   时间限制:1.0s   内存限制:256.0MB      问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...

  3. C语言 · 3000米排名预测

    算法提高 3000米排名预测   时间限制:1.0s   内存限制:256.0MB      问题描述 3000米长跑时,围观党们兴高采烈地预测着最后的排名.因为他们来自不同的班,对所有运动员不一定都 ...

  4. 问题 1936: [蓝桥杯][算法提高VIP]最大乘积

    问题 1936: [蓝桥杯][算法提高VIP]最大乘积 时间限制: 1Sec 内存限制: 128MB 提交: 77 解决: 16 题目描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? ...

  5. 蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法)

    蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法) 首先这不是一个多难的题,但是网上的我没怎么找到有Java的代码,基本全都是c语言的,小编是个小白,如果有不对的地方请联系小编 问题描述 ...

  6. Java实现 蓝桥杯 算法提高 成绩排名

    试题 算法提高 成绩排名 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小明刚经过了一次数学考试,老师由于忙碌忘记排名了,于是老师把这个光荣的任务交给了小明,小明则找到了聪明的你, ...

  7. Java实现 蓝桥杯 算法提高 进攻策略加强(暴力)

    试题 算法提高 进攻策略加强 问题描述 植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物. 首先,僵尸有m种(每种僵尸都是无限多的),玩家可以选择合适的僵尸来进攻.使用第i种僵尸需要 ...

  8. Java实现 蓝桥杯 算法提高 小X的购物计划

    试题 算法提高 小X的购物计划 问题描述 小X打算去超市shopping.小X没什么钱,只有N元.超市里有M种物品,每种物品都需要money,在小X心中有一个重要度.有的物品有无限件,有的物品只有几件 ...

  9. 蓝桥杯算法提高 P1001(大数乘法)

      算法提高 P1001   时间限制:1.0s   内存限制:256.0MB   当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体 ...

随机推荐

  1. 第三个spirit(第十四天)

    一 .进度(自习室) 本来十号要开始进行第三次冲刺,不过因为团队很多成员要进行协会和组织的换届,而且团队还换了新 人又加了人进来,所以我们今天才是第三次冲刺的第一天.我们进行了新团队的第一次会议.基于 ...

  2. mysql 性能分析及explain用法

    转载自http://blog.sina.com.cn/s/blog_4586764e0100o9s1.html 使用explain语句去查看分析结果 如   explain select * from ...

  3. 使用Crash工具查看一个TCP listen sock内存布局实例

    利用crash工具,我们可以很方便的查看正在运行内核的一些全局变量的数据结构,如TCP的ehash.bhash哈希桶,全局变量的查看比较简单.Crash工具还允许我们查看调用堆栈内部的局部变量,下面示 ...

  4. 安装centos6及安装redhat6后的配置

    一.安装centos6 在引导到镜像后,选择: 我选择第二个,使用基本的显卡驱动安装系统 #第一个也是可以选的(安装或升级现有的系统) 之后,与 RHEL5 同样,使用光盘引导安装,系统会提示我们是否 ...

  5. [总结] Visual Studio 报价已经对比

    来源微软官方网站 对比 https://visualstudio.microsoft.com/zh-hans/vs/compare/?rr=https%3A%2F%2Fwww.ithome.com%2 ...

  6. es6 很简单

    es6出了许多好的,优秀的特性.下面列举一些常用的 其实这些特性都很好理解,一两句话就可以表达出来看.主要是对旧的写法的一种改进. function  加了一些语言糖,传参更方便 class      ...

  7. springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

    相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展.会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新 ...

  8. 【Linux】Linux定时任务Crontab命令详解

    linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, 由于使用者自己也可以设置计划任务,所以, ...

  9. java的finally用法

    finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下. 之前在写爬虫的时候数据 ...

  10. MySql数据库迁移图文展示

    MySql数据库的数据从一台服务器迁移到另外一台服务器需要将数据库导出,再从另外一台服务器导入.方法有很多,MySql配套的相关工具都有这个功能.phpMyAdmin就可以做,但是这个加载起来慢,推荐 ...