蓝桥杯 - 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;
}
目录
相关文章
|
24天前
|
安全
202012-1 期末预测之安全指数
202012-1 期末预测之安全指数
|
1月前
|
C语言
跳水运动员预测比赛结果排名次问题详解(逻辑类型题1)
跳水运动员预测比赛结果排名次问题详解(逻辑类型题1)
22 0
|
算法
蓝桥杯 算法提高 统计平均成绩
蓝桥杯 算法提高 统计平均成绩
74 0
|
算法 C++
【每日算法Day 98】慈善赌神godweiyang教你算骰子点数概率!
【每日算法Day 98】慈善赌神godweiyang教你算骰子点数概率!
|
机器学习/深度学习 传感器 算法
2023美赛F题-绿色GDP思路及matlab代码
2023美赛F题-绿色GDP思路及matlab代码
|
Shell
一维数组实验题:大奖赛现场统分。已知某大奖赛有n个选手参赛,m(m>2)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉一个最高分和一个最低分后,取平均分作为该选
一维数组实验题:大奖赛现场统分。已知某大奖赛有n个选手参赛,m(m>2)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉一个最高分和一个最低分后,取平均分作为该选
463 0
|
安全
L3-009 长城 (30 分)(数学知识)
L3-009 长城 (30 分)(数学知识)
187 0
L3-009 长城 (30 分)(数学知识)
|
存储 算法 容器
天梯赛二阶题——L2-015 互评成绩(25 分)
学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。
326 0
天梯赛二阶题——L2-015 互评成绩(25 分)
|
C语言 C++
1102 教超冠军卷 (20 分)
“教育超市”是拼题 A 系统的一个衍生产品,发布了各种试卷和练习供用户选购。在试卷列表中,系统不仅列出了每份试卷的单价,还显示了当前的购买人次。本题就请你根据这些信息找出教育超市所有试卷中的销量(即购买人次)冠军和销售额冠军。
136 0