#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. 浅谈Java中的Hashmap

    HashMap:   java.lang.Object ∟ java.util.AbstractMap<K,V> ∟ java.util.HashMap<K,V> 类型参数: ...

  2. IDE调研之二

    Eclipse和Jetbrains的IntelliJ IDEA对比: Eclipse工具 在Eclipse中,可以最大化控制台.通过双击标签或者Ctrl+M快捷键就可以实现,但是在IntelliJ I ...

  3. Java Lock & Condition

    /* jdk1.5以后将同步和锁封装成了对象. 并将操作锁的隐式方式定义到了该对象中, 将隐式动作变成了显示动作. Lock接口: 出现替代了同步代码块或者同步函数.将同步的隐式锁操作变成现实锁操作. ...

  4. angularJS1笔记-(3)-购物车增删改查练习

    html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  5. EJB是什么

    EJB (enterprise java bean)   EJB 概念的剖析 我们先看一下,EJB 的官方解释: 商务软件的核心部分是它的业务逻辑.业务逻辑抽象了整个商务过程的流程,并使用计 算机语言 ...

  6. Acdream1311_Apple

    无聊的时候看到上一次acdream群赛的一个题目,中间居然是有alice和bob的博弈题目,于是就去做了. 给n,m,两人轮流操作,每次操作可以使n+1,或者m+1,谁操作后满足nm>=A,那么 ...

  7. HDU2883_kebab

    很好的题目. 有不多于200个任务,每个任务要在si到ei这个时间段内完成,每个任务的任务量是ti*ni,只有一台机器,且其单位时间内可完成的任务量为m. 现在问你,能否使所有的任务全部在规定的时间段 ...

  8. DPM(Deformable Parts Model)

    DPM(Deformable Parts Model) Reference: Object detection with discriminatively trained partbased mode ...

  9. 触发Full GC执行的情况 以及其它补充信息

    除直接调用System.gc外,触发Full GC执行的情况有如下四种.1. 旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象.大数组时才会出现不足的现象,当执行Full GC后空间仍然不足 ...

  10. Java集合类框架的基本接口有哪些?

    总共有两大接口:Collection 和Map ,一个元素集合,一个是键值对集合: 其中List和Set接口继承了Collection接口,一个是有序元素集合,一个是无序元素集合: 而ArrayLis ...