COGS——T 438. 烦人的幻灯片

http://www.cogs.pro/cogs/problem/problem.php?pid=438

★☆   输入文件:slides.in   输出文件:slides.out   简单对比
时间限制:1 s   内存限制:128 MB

【问题描述

李教授将于今天下午作一次非常重要的演讲。不幸的是他不是一个非常爱整洁的人,他把自己演讲要用的幻灯片随便堆在了一起。因此,演讲之前他不得不去整理这些幻灯片。做为一个讲求效率的学者,他希望尽可能简单地完成它。教授这次演讲一共要用n张幻灯片(n≤26),这n张幻灯片按照演讲要使用的顺序已经用数字l,2,…,n在上面编了号。因为幻灯片是透明的,所以我们不能一下子看清每一个数字所对应的幻灯片。
现在我们用大写字母A,B,C,…再次把幻灯片依次编号。你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是惟一的;若是出现多种对应的情况或是某些数字编号和字母编号对应不起来,我们就称对应是无法实现的。
输入格式】
幻灯片的情况通过一个文本文件slides.in输入。
文件的第1行只有一个整数n,表示有n张幻灯片,接下来的n行每行包括4个整数Xmin,Xmax,Ymin,Ymax(整数之间用空格分开)为幻灯片的坐标,这n张幻灯片按其在输入文件中出现的顺序从前到后依次编号为A,B,C,…
再接下来的n行依次为n个数字编号的坐标x,y,显然在幻灯片之外是不会有数字的。
 
输出格式】
要求将程序的运行结果写入一个名为slides.out的文本文件。若是对应可以实现,输出文件应该包括n行,每一行为一个字母和一个数字,中间以一个空格隔开,并且各行以字母的升序排列,注意输出的字母要大写并且顶格;反之,若是对应无法实现,在文件的第1行顶格输出None即可。行首行末并无多余的空格。
输入输出样例】
输 入
4
6 22 10 20
4 18 6 16
8 20 2 18
10 24 4 8
9 15
19 17
11 7
21 11
输 出
A 4
B 1
C 2
D 3
 
数据很水。。貌似随便写写就能过
 1 #include <cstring>
 2 #include <cstdio>
 3 
 4 int n,x,y,ans;
 5 struct Node
 6 {
 7     int xmax,xmin,ymax,ymin;
 8 }zm[27];
 9 
10 bool vis[27];
11 int rd[27],match[27],map[27][27];
12 bool find(int u)
13 {
14     for(int v=1;v<=n;v++)
15         if(map[u][v]&&!vis[v])
16         {
17             vis[v]=1;
18             if(!match[v]||find(match[v]))
19             {
20                 match[v]=u;
21                 return true;
22             }
23         }
24     return false;
25 }
26 
27 inline void read(int &x)
28 {
29     x=0; register char ch=getchar();
30     for(;ch>'9'||ch<'0';) ch=getchar();
31     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
32 }
33 
34 int AC()
35 {
36     freopen("slides.in","r",stdin);
37     freopen("slides.out","w",stdout);
38     
39     read(n);
40     for(int i=1;i<=n;i++)
41         read(zm[i].xmin),read(zm[i].xmax),read(zm[i].ymin),read(zm[i].ymax);
42     for(int i=1;i<=n;i++)
43     {
44         read(x),read(y);
45         for(int j=1;j<=n;j++)
46             if(zm[j].xmax>=x&&zm[j].xmin<=x&&zm[j].ymax>=y&&zm[j].ymin<=y)
47                 map[i][j]=1,rd[j]++;
48     }
49     for(int i=1;i<=n;i++)
50     {
51         if(find(i)) ans++;
52         memset(vis,0,sizeof(vis));
53     }
54     bool flag=0;
55     for(int i=1;i<=n;i++)
56         if(rd[i]<2) flag=1;
57     if(ans!=n||!flag) printf("None");
58     else
59     {
60         for(int i=1;i<=n;i++)
61         {
62             printf("%c ",'A'+i-1);
63             printf("%d
",match[i]);
64         }
65     }
66     return 0;
67 }
68 
69 int Hope=AC();
70 int main(){;}
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
原文地址:https://www.cnblogs.com/Shy-key/p/7467446.html