蓝桥杯 - 3000米排名预测

简介: 蓝桥杯 - 3000米排名预测

题目链接:点击打开链接


题目大意:略。


解题思路:全排列 + 限制条件(judge()函数注释)。


AC 代码

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof a);
using namespace std;
typedef long long ll;
/*
len:记录有多少排名的可能个数
vis:是否使用过该点
num:存储预备的数据
rcd:记录符合题意的数据(从num[]获取)
 rs:记录最终符合题意的所有数据(从rcd[]获取)
 mk:记录预判信息
*/
int n,m,len,vis[20],mk[20][20],num[20],rcd[20],rs[1000000][20];
// 初始化
void init()
{
    len=0;
    mem(mk,0);
    for(int i=0;i<20;i++) // 预备存储数据,取决于题目是需要存储什么类型的数据
        num[i]=i;
    mem(vis,0);
    mem(rcd,0);
    mem(rs,0);
}
// 判断是否符合正确的预判
int judge()
{
    // f1:标记预判为1的结果; f2:标记预判为0的结果
    int f1=1,f2=1;
    for(int i=0;i<m;i++) // 通过记录个数判断是否符合预判为1的限定
    {
        if(mk[i][mk[i][0]+1]==1&&f1)
        {
            int j=1;
            for(int x=0; j<=mk[i][0]&&x<n; x++)
            {
                if(mk[i][j]==rcd[x])
                    j++;
            }
            if(j<mk[i][0]+1) // +1 因为上面 j 先 ++,再判断
                f1=0;
        }
        else // 通过记录个数判断是否符合预判为0的限定
        {
            int j=1;
            for(int x=0; j<=mk[i][0]&&x<n; x++)
            {
                if(mk[i][j]==rcd[x])
                    j++;
            }
            if(j==mk[i][0]+1) // 同上
                f2=0;
        }
        if(!f1 || !f2)
        {
            break;
        }
    }
    if(f1&&f2)
        return 1;
    else
        return 0;
}
void dfs(int l)
{
    if(l==n&&judge())
    {
        for(int i=0;i<n;i++) // 记录每一组符合题意的数据
        {
            rs[len][i]=rcd[i];
        }
        len++;
        return;
    }
    for(int i=0;i<n;i++)
    {
        if(!vis[i])
        {
            vis[i]=1;
            rcd[l]=num[i];
            dfs(l+1);
            vis[i]=0;
        }
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        init();
        for(int k=0;k<m;k++)
        {
            int c; scanf("%d",&c);
            mk[k][0]=c; // 记录长度
            for(int i=1;i<=c+1;i++) // +1 记录后面预判(1、0)
                scanf("%d",&mk[k][i]);
        }
        dfs(0); // 从第0号球员开始搜
        printf("%d\n",len);
        for(int i=0;i<len;i++)
        {
            for(int j=0;j<n;j++)
                printf("%d ",rs[i][j]);
            puts("");
        }
    }
    return 0;
}
目录
相关文章
|
7月前
|
安全
202012-1 期末预测之安全指数
202012-1 期末预测之安全指数
|
6月前
|
搜索推荐 算法 C++
蓝桥杯分糖果、最小化战斗力差距、小蓝零花钱
这是一个关于算法问题的集合,包括三个不同的任务: 1. **分糖果**:肖恩有不同种类的糖果要分给学生,目标是使得到糖果字符串的字典序最大且尽量小。给定糖果种类数和一个初始字符串,输出能达到的最小字典序的最大值。 2. **最小化战斗力差距**:小蓝需要将队员分为两组,每组战斗力差距最小。给定队员数量和战斗力值,找出最小的战斗力差距。 3. **小蓝的零花钱**:小蓝要在序列中分割偶数和奇数,每次分割代价是两端元素差的绝对值。目标是在预算内确定最多能进行多少次这样的分割。 每个问题都提供了输入输出示例和相应的C++代码片段来解决这些问题。
|
7月前
R语言预测人口死亡率:用李·卡特(Lee-Carter)模型、非线性模型进行平滑估计
R语言预测人口死亡率:用李·卡特(Lee-Carter)模型、非线性模型进行平滑估计
|
人工智能 算法 C语言
LeetCode.每日一题 1039. 多边形三角剖分的最低得分
这题是一道区间Dp问题,将一个多边形形划分为若干个三角形,求其最小的得分.
102 0
|
测试技术
L2-003 月饼 (25 分)(贪心)
L2-003 月饼 (25 分)(贪心)
85 0
|
算法
蓝桥杯 算法提高 统计平均成绩
蓝桥杯 算法提高 统计平均成绩
103 0
|
安全
L3-009 长城 (30 分)(数学知识)
L3-009 长城 (30 分)(数学知识)
226 0
L3-009 长城 (30 分)(数学知识)
PTA 1082 射击比赛 (20 分)
本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军
99 0
牛客 仓鼠与珂朵莉(在线区间带权众数)
牛客 仓鼠与珂朵莉(在线区间带权众数)
93 0