P1007 --- 排座椅

来源:互联网 发布:overture 5 for mac 编辑:程序博客网 时间:2024/04/25 06:03
背景 Background
NOIP2008年普及组第二题
描述 Description
   上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。 
   请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生对数最少。
输入格式 InputFormat
输入的第一行,有5各用空格隔开的整数,分别是M,N,K,L,D(2<=N,M<=1000,0<=K<M,0<=L<N,D<=2000)。 
接下来D行,每行有4个用空格隔开的整数,第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。 
输入数据保证最优方案的唯一性。
输出格式 OutputFormat
第一行包含K个整数,a1a2……aK,表示第a1行和a1+1行之间、第a2行和第a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。 
第二行包含L个整数,b1b2……bk,表示第b1列和b1+1列之间、第b2列和第b2+1列之间、…、第bL列和第bL+1列之间要开辟通道,其中bi< bi+1,每两个整数之间用空格隔开(行尾没有空格)。

 

代码:

001#include <stdio.h>
002//使用二维数组,因为还需要另外遍历一遍,来进行记录。
003typedef struct
004{
005    int x,y;
006}Student;
007Student student1[1100],student2[1100];
008int f[2100][2100];
009int min(int x,int y);
010int main()
011{
012    int t1,t2;
013    int i,j,k;
014    int N,M,K,L,D;
015    int x,x1,y,y1;
016    while(scanf("%d %d %d %d %d",&M,&N,&K,&L,&D)!=EOF)
017    {
018        //K,L分别代表横竖各隔开的数目。
019        //M行N列
020        t1=0;
021        for(i=0;i<D;i++)
022            {
023                scanf("%d %d %d %d",&x,&y,&x1,&y1);
024                if(x==41 && x1==42 || x==42 && x1==41)t1++;
025                if(x==x1)
026                {
027                    y=y*2;y1=y1*2;x=x*2;
028                    int tt=min(y,y1);
029                    f[x][tt+1]=1;
030                }
031                else
032                {
033                    x=x*2;x1=x1*2;y=y*2;
034                    int t=min(x,x1);
035                    f[t+1][y]++;
036                }
037            }
038        /*printf("%d\n",t1);*/
039        int num;
040        int k1=1;
041        for(i=3;i<M*2;i=i+2)
042        {
043            num=0;
044            for(j=2;j<=N*2;j=j+2)
045                if(f[i][j]) num=num+f[i][j];
046            if(num){student1[k1].x=num;student1[k1].y=i/2;k1++;}
047             
048        }      
049        int k2=1;
050        for(i=3;i<N*2;i=i+2)
051        {
052            num=0;
053            for(j=2;j<=M*2;j=j+2)
054                if(f[j][i]) num++;
055            if(num){
056                student2[k2].x=num;student2[k2].y=(i-1)/2;
057                k2++;
058            }
059        }  
060 
061        //排下序,之后输出即可。
062        for(i=1;i<k1;i++)
063            for(j=1;j<k1-1;j++)
064                {
065                    if(student1[j].x>student1[j+1].x)
066                    {
067                        Student q=student1[j];
068                        student1[j]=student1[j+1];
069                        student1[j+1]=q;
070                    }
071                    else if(student1[j].x==student1[j+1].x)
072                    {
073                        if(student1[j].y<student1[j+1].y)
074                            {
075                                Student q=student1[j];
076                                student1[j]=student1[j+1];
077                                student1[j+1]=q;
078                            }
079                    }
080                     
081                }
082        for(i=1;i<k2;i++)
083            for(j=1;j<k2-1;j++)
084                {
085                    if(student2[j].x>=student2[j+1].x)
086                        {
087                            Student q=student2[j];
088                            student2[j]=student2[j+1];
089                            student2[j+1]=q;
090                        }
091                    else if(student2[j].x==student2[j+1].x)
092                    {
093                        if(student2[j].y<student2[j+1].y)
094                            {
095                                Student q=student2[j];
096                                student2[j]=student2[j+1];
097                                student2[j+1]=q;
098                            }
099                    }
100                }
101        //记录下都有哪些需要输出
102        int ff1[1010],ff2[1010];
103        k=0;
104        for(i=k1-1;i>=k1-K;i--)
105            ff1[k++]=student1[i].y;
106        k=0;
107        for(i=k2-1;i>=k2-L;i--)
108            ff2[k++]=student2[i].y;
109 
110        for(i=0;i<K;i++)
111            for(j=0;j<K-1;j++)
112            {
113                if(ff1[j]>ff1[j+1])
114                {
115                    int l=ff1[j];
116                    ff1[j]=ff1[j+1];
117                    ff1[j+1]=l;
118                }
119            }
120        for(i=0;i<L;i++)
121            for(j=0;j<L-1;j++)
122            {
123                if(ff2[j]>ff2[j+1])
124                {
125                    int l=ff2[j];
126                    ff2[j]=ff2[j+1];
127                    ff2[j+1]=l;
128                }
129            }
130        for(i=0;i<K;i++)
131            if(i==0)printf("%d",ff1[i]);
132            else printf(" %d",ff1[i]);
133            printf("\n");
134 
135        for(i=0;i<L;i++)
136            if(i==0)printf("%d",ff2[i]);
137            else printf(" %d",ff2[i]);
138            printf("\n");
139 
140        //最后需要再初始化数组
141        for(i=0;i<2100;i++)
142            for(j=0;j<2100;j++)
143                f[i][j]=0;
144 
145    }
146    return 0;
147}
148 
149int min(int x,int y)
150{
151    return x>y? y:x;
152}

 

 

 

 

0 0
原创粉丝点击