X-man

导航

hdu 1567 2006 (题意理解容易出错)

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
struct Node
{
    int x,y;
} p;
bool cmp(Node a,Node b)
{
    if(a.x<b.x)return true;
    if(a.x==b.x&&a.y<b.y)return true;
    return false;
}
vector<Node>ve;
int main()
{
    int n,m;
    int x,y,flag;
    int i,j;
    while(scanf("%d",&n)!=EOF)
    {
        flag=1;
        ve.clear();
        m=n;
        n=n*(n-1)/2;
        for(i=0; i<n; i++)
        {
            scanf("%d-%d",&x,&y);
            if(flag)
            {
                if(x==y)
                {
                    flag=0;
                }
                else if(x>y)
                {
                    p.x=y;
                    p.y=x;
                    ve.push_back(p);
                }
                else
                {
                    p.x=x;
                    p.y=y;
                    ve.push_back(p);
                }
            }

        }
        if(flag)
        {
            int k=0;
            sort(ve.begin(),ve.end(),cmp);
            for(i=1; i<m; i++)
            {
                if(flag)
                    for(j=i+1; j<=m; j++)
                    {
                        if(i!=ve[k].x||j!=ve[k].y)
                        {
                            flag=0;
                            break;
                        }
                        k++;
                    }
                else break;
            }
        }
        if(flag)printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
View Code
#include<iostream>
#include<string.h>
#include<cstdio>

using namespace std;
int flag[2010][2010];
int main()
{

    int i,j;
    int n,a,b;

    char str[20];

    while(scanf("%d",&n)!=EOF)
    {

        memset(flag,0,sizeof(flag));
        int tag=0;

        for(i=1;i<n;i++)
        {
            for(j=1;j<=n/2;j++)
            {
                cin>>str;
                sscanf(str,"%d-%d",&a,&b);
                if(flag[a][b]==1||flag[b][a]==1||a==b)
                {
                    tag=1;
                }
                flag[a][0]++;
                flag[b][0]++;
                flag[a][b]=1;
                flag[b][a]=1;
            }
        }
        if(tag)
        printf("No\n");
        else
        {
            int tag1=0;
            for(i=1;i<=n;i++)
            {
                if(flag[i][0]!=n-1)
                {
                    tag1=1;
                    printf("No\n");
                    break;
                }
            }
            if(!tag1)
            printf("Yes\n");
        }
    }
    return 0;
}
View Code

都WA了,疑惑不解啊!!!

题意问题!!!!!!!??

 

正确理解方式:

  每一行的输入是每只队伍比赛且仅比赛一次;

  所有输入的组合是赛事安排的所有可选解

正解:

#include<stdio.h>
#include<string.h>
int flag[2010][2010];
int hang[2010];
int main()
{

    int i,j;
    int n,a,b;

    char str[20];

    while(scanf("%d",&n)!=EOF)
    {

        memset(flag,0,sizeof(flag));
        int tag=0;

        for(i=1;i<n;i++)
        {
            memset(hang,0,sizeof(hang));
            for(j=1;j<=n/2;j++)
            {
                //cin>>str;
                scanf("%d-%d",&a,&b);
                if(flag[a][b]==1||flag[b][a]==1||a==b)
                {
                    tag=1;
                }
                hang[a]++;
                hang[b]++;
                flag[a][0]++;
                flag[b][0]++;
                flag[a][b]=1;
                flag[b][a]=1;
            }
            for(j=1;j<=n;j++)
            {
                if(hang[j]!=1)
                {
                    tag=1;
                    break;
                }
            }
        }
        if(tag)
        printf("No\n");
        else
        {
            int tag1=0;
            for(i=1;i<=n;i++)
            {
                if(flag[i][0]!=n-1)
                {
                    tag1=1;
                    printf("No\n");
                    break;
                }
            }
            if(!tag1)
            printf("Yes\n");
        }
    }
    return 0;
}

 

#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
struct Node
{
    int x,y;
} p;
bool cmp(Node a,Node b)
{
    if(a.x<b.x)return true;
    if(a.x==b.x&&a.y<b.y)return true;
    return false;
}
vector<Node>ve;
int hang[2010];
int main()
{
    int n;
    int x,y,flag;
    int i,j;
    while(scanf("%d",&n)!=EOF)
    {
        flag=1;
        ve.clear();
        for(i=1; i<n; i++)
        {
            memset(hang,0,sizeof(hang));
            for(j=1; j<=n/2; j++)
            {
                scanf("%d-%d",&x,&y);
                hang[x]++;
                hang[y]++;
                if(flag)
                {
                    if(x==y)
                    {
                        flag=0;
                    }
                    else if(x>y)
                    {
                        p.x=y;
                        p.y=x;
                        ve.push_back(p);
                    }
                    else
                    {
                        p.x=x;
                        p.y=y;
                        ve.push_back(p);
                    }
                }
            }
            for(j=1;j<=n/2;j++)
            {
                if(hang[j]!=1)
                {
                    flag=0;
                    break;
                }
            }
        }
        if(flag)
        {
            int k=0;
            sort(ve.begin(),ve.end(),cmp);
            for(i=1; i<n; i++)
            {
                if(flag)
                    for(j=i+1; j<=n; j++)
                    {
                        if(i!=ve[k].x||j!=ve[k].y)
                        {
                            flag=0;
                            break;
                        }
                        k++;
                    }
                else break;
            }
        }
        if(flag)printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

 

 

posted on 2013-10-02 19:47  雨钝风轻  阅读(282)  评论(0编辑  收藏  举报