Gym 101308D Database 枚举

大致题意:

给出一张表,n行m列,每一行的列用逗号分隔。判断这个表是否有冗余元素。如果一张表中有两行两列对应的的元素相同,那么这个表就有冗余元素。

分析:

先枚举要排序的列,然后枚举行,如果相邻两行相等,再枚举列,判断元素是否相等。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int maxn=10000+5;
char s[105];
int n,m;
int now_c;

struct Row
{
    int id;
    char col[15][105];
} row[maxn];

void shit(int index)
{
    row[index].id=index;
    int i=0, k = 0, t = 0;
    while(s[i]!=‘\0‘)
    {
        if (s[i] == ‘,‘)
        {
            k++;
            t=0;
            i++;
        }
        row[index].col[k][t++] = s[i];
        i++;
    }
}

bool cmp(Row a,Row b)
{
    if(strcmp(a.col[now_c],b.col[now_c])<0)
        return true;
    return false;
}

int main()
{
//    freopen("in.txt","r",stdin);
    freopen("database.in","r",stdin);
    freopen("database.out","w",stdout);
    scanf("%d%d",&n,&m);
    getchar();
    for(int i=0; i<n; i++)
    {
        gets(s);
        shit(i);
    }
    for(int i=0; i<m; i++)  //枚举要排序的列
    {
        now_c=i;
        sort(row,row+n,cmp);
        for(int j=0; j<n; j++)  //枚举行
        {
            for(int k=j+1; k<n && strcmp(row[k].col[i],row[j].col[i])==0; k++)  //判断相邻两行,第i列是否相等
            {
                for(int p=i+1; p<m; p++)    //枚举要判断的列
                {
                    if(strcmp(row[k].col[p],row[j].col[p])==0)
                    {
                        puts("NO");
                        printf("%d %d\n",row[j].id+1,row[k].id+1);
                        printf("%d %d\n",i+1,p+1);
                        return 0;
                    }
                }
            }
        }
    }
    puts("YES");

    return 0;
}
时间: 2024-10-18 07:02:12

Gym 101308D Database 枚举的相关文章

SpringBoot配置文件属性值

flyway.baseline-description 执行基线时标记已有Schema的描述. flyway.baseline-on-migrate 在没有元数据表的情况下,针对非空Schema执行迁移时是否自动调用基线.(默认值:false.) flyway.baseline-version 执行基线时用来标记已有Schema的版本.(默认值:1.) flyway.check-location 检查迁移脚本所在的位置是否存在.(默认值:false.) flyway.clean-on-valid

学习Spring-Data-Jpa(二十一)---DataSource与JPA属性配置

1.SpringBoot 2.2.x默认使用的DataSource SpringBoot 2.2.x版本,默认使用的DataSource是HikariCP,可以直接通过注入DataSource,并打印出打印全限定名,可以查看. 或可以通过查看自动配置源码,来找到: @SpringBootApplication -> @EnableAutoConfiguration 所在jar包的META-INF/spring.factories中可以找到org.springframework.boot.auto

Gym 100338I TV show (dfs枚举)

Gym 100338I 题意: 一个人去参加电视有奖问答的节目,初始奖金为100元,每答对一道问题奖金翻倍,答错奖金清零.此外有一次保险机会:花费C的奖金,下一题可以答对奖金翻倍,答错奖金不清零. 现在给你答对每道题的概率,求最优答题策略的奖金期望. 思路: 先不考虑有保险机会.回答对第j题后离开的奖金期望就是: 100?2j?∏ji=1pi 那么我们枚举回答对第j题后离开的奖金期望,维护其最大值即可(注意也可以一题不回答直接走人,期望为100). 那么我们现在来考虑有保险机会的情况,我们枚举回

Codeforces Gym 100002 B Bricks 枚举角度

Problem B Bricks" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100002 Description The prisoner of the "IF" castle has decided to run away by disassembling the brick wall in his prison cell. To hide his work from his

【递推】【DFS】【枚举】Gym - 101246C - Explode &#39;Em All

网格里放了一些石块,一个炸弹能炸开其所在的行和列.问炸光石块至少要几个炸弹. 枚举不炸开的行数,则可以得出还要炸开几列. 为了不让复杂度爆炸,需要两个优化. 先是递推预处理出f(i)表示i的二进制位中1的个数,f(i)=f(i-2^k)+1,k是可以推算出来的. 还要DFS枚举不炸开的行数,防止重复访问.(类似容斥的时候的写法) #include<cstdio> #include<algorithm> using namespace std; int n,m,f[1<<

Gym 101194L / UVALive 7908 - World Cup - [三进制状压暴力枚举][2016 EC-Final Problem L]

题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5930 题意: 现有四支队伍两两打比赛,总共就是打六场比赛,每场比赛赢的队伍可得 $3$ 分,输的队伍得 $0$ 分,平局则两个队各得 $1$ 分. 现在给出四个队伍最终的积分

【枚举约数】Gym - 101412A - Ginkgo Numbers

给你一堆定义,问你在那个定义下,<p,q>是不是素数.其实那堆定义都不用管,只要看最下面给你的提示即可. 根据,只要把m^2+n^2当一个整体,去枚举(p^2+q^2)的约数即可,然后再枚举m, 这样的枚举出来是必要的,然后再根据这个充要条件判一下即可. #include<cstdio> #include<cmath> using namespace std; const double EPS=0.00000001; int T; int p,q; bool check

【枚举】【高斯消元】Gym - 101412D - Find the Outlier

给你一个未知的d次多项式在0,1,...,d+2处的取值,其中有且只有一个是错的,问你哪个是错的. 枚举哪个是错的,再在剩下的d+2个中取d+1个高斯消元,解出多项式系数,然后代一下最后剩下的那个数看看是否合法,如果合法再看看那个错的是否真的错了. #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; #define N 11 d

【DFS】【枚举】Gym - 101246G - Revolutionary Roads

给你一张有向图,问你将任意一条边变成双向后,所能得到的最大强连通分量的大小. 缩点之后,预处理can(i,j)表示i能到j. 之后枚举每一条边(u,v),再枚举其他所有点t,如果can(u,t) && can(t,v),则t能和u.v共在一个强连通分量,尝试更新答案. #include<cstdio> #include<algorithm> #include<vector> #include<cstring> using namespace