蓝桥杯 - 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;
}
目录
相关文章
|
6月前
|
安全
202012-1 期末预测之安全指数
202012-1 期末预测之安全指数
|
5月前
|
搜索推荐 算法 C++
蓝桥杯分糖果、最小化战斗力差距、小蓝零花钱
这是一个关于算法问题的集合,包括三个不同的任务: 1. **分糖果**:肖恩有不同种类的糖果要分给学生,目标是使得到糖果字符串的字典序最大且尽量小。给定糖果种类数和一个初始字符串,输出能达到的最小字典序的最大值。 2. **最小化战斗力差距**:小蓝需要将队员分为两组,每组战斗力差距最小。给定队员数量和战斗力值,找出最小的战斗力差距。 3. **小蓝的零花钱**:小蓝要在序列中分割偶数和奇数,每次分割代价是两端元素差的绝对值。目标是在预算内确定最多能进行多少次这样的分割。 每个问题都提供了输入输出示例和相应的C++代码片段来解决这些问题。
|
6月前
|
C语言
跳水运动员预测比赛结果排名次问题详解(逻辑类型题1)
跳水运动员预测比赛结果排名次问题详解(逻辑类型题1)
63 0
|
算法 C++
【每日算法Day 98】慈善赌神godweiyang教你算骰子点数概率!
【每日算法Day 98】慈善赌神godweiyang教你算骰子点数概率!
131 0
软考:净现值NPV、回收期、收益率计算方法
软考:净现值NPV、回收期、收益率计算方法
613 0
软考:净现值NPV、回收期、收益率计算方法
|
Shell
一维数组实验题:大奖赛现场统分。已知某大奖赛有n个选手参赛,m(m>2)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉一个最高分和一个最低分后,取平均分作为该选
一维数组实验题:大奖赛现场统分。已知某大奖赛有n个选手参赛,m(m>2)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉一个最高分和一个最低分后,取平均分作为该选
509 0
|
存储 算法 容器
天梯赛二阶题——L2-015 互评成绩(25 分)
学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。
365 0
天梯赛二阶题——L2-015 互评成绩(25 分)
力扣第 285 场周赛 :统计道路上的碰撞次数
在一条无限长的公路上有 n 辆汽车正在行驶。汽车按从左到右的顺序按从 0 到 n - 1 编号,每辆车都在一个 独特的 位置。
159 0
力扣第 285 场周赛 :统计道路上的碰撞次数