PID221 / 烦人的幻灯片☆ x

Posted 云深不知处

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PID221 / 烦人的幻灯片☆ x相关的知识,希望对你有一定的参考价值。

超详细解释!我都被我自己惊呆了!

(这个题目意思我缓冲了很久!一定要读懂题!否则做不出来)

题目不懂就多读呀~

题目描述

李教授于今天下午做一个非常重要的演讲。不幸的是他不是一个非常爱整洁的人,他把自己做演讲要用的幻灯片随便堆放在一起。因此,演讲之前他不得不去整理这些幻灯片。做为一个讲求效率的学者,他希望尽可能简单地完成它。情况是这样,教授这次演讲一共要用n张幻灯片(n<=26),这n张幻灯片按照演讲要使用的顺序已经用数字1,2,…,n在上面编上了号。因为幻灯片是透明的,所以我们不能一下子看清每一个数字所对应的幻灯片。

现在我们用大写字母A,B,C,。。。再次把幻灯片依次编上号,如样例所示,我们可以很快发现编号为A的幻灯片是第4张,把它抽出来后我们又可以确定编号为C的幻灯片是第2张,。。。

你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是唯一的;若是出现多种对应的情况或是某些数字编号和字母对应不起来,我们就称对应是无法实现的。

输入格式

第一行只有一个数n,表示有n张幻灯片,接下来的n行第行包括4个整数Xmin,Xmax,Ymin,Ymax(整数之间用空格分开),为幻灯片的坐标(该区域为幻灯片),这n张幻灯片按其在输入文件中出现的顺序从前到后依次编号为A,B,C,。。。再接下来的n行依次为n个数字编号的坐标X,Y,显然在幻灯片之外是不会有数字的。

(其实是键盘输入了啦)

输出格式

若是对应可以实现,你的输出应该包括n行,每一行为一个字母和一个数字,中间以一个空格隔开,并且各行以字母的升序排列,注意输出的字母要大写并且顶格;反之,若是对应无法实现,在文件的第一行顶格输出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

样例输出

A4
B1
C2
D3

代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring> 
  4 
  5 using namespace std;
  6 
  7 int n,anse;
  8 int vis[111][111];
  9 int head,QwQ[111];
 10 
 11 struct Q_zb{
 12     Q_zb ()//进行初始化 
 13     {
 14         top=0;
 15         ans=0;
 16     }
 17     int xmin,xmax,ymin,ymax;
 18     int top,ans;//统计答案 
 19     void add()
 20     {
 21         top++;
 22     }
 23     void shanchu()
 24     {
 25         top--;
 26     }    
 27 }QAQ[27];
 28 
 29 void Q_in()   //进行输入 
 30 {
 31     int x,y;   //横纵坐标 
 32     scanf("%d",&n);
 33     for(int i=1;i<=n;i++)
 34     {
 35         scanf("%d%d%d%d",&QAQ[i].xmin,&QAQ[i].xmax,&QAQ[i].ymin,&QAQ[i].ymax);
 36     }
 37     for(int i=1;i<=n;i++) //第几张数字幻灯片 
 38     {
 39         scanf("%d%d",&x,&y);
 40         for(int k=1;k<=n;k++) //第几张字母幻灯片 
 41         {
 42             if(QAQ[k].xmin<=x&&QAQ[k].xmax>=x&&QAQ[k].ymin<=y&&QAQ[k].ymax>=y)
 43             {
 44                 QAQ[k].add();
 45                 vis[k][i]=1;//k表示第‘k+64‘张幻灯片 (字母幻灯片)
 46             } //表示‘k+64‘张幻灯片可能是第几张数字幻灯片,进行标记 
 47         }
 48     }
 49 }
 50 
 51 bool Q_topos()   //判断是否能够找到对应关系 
 52 {
 53     for(int i=1;i<=n;i++) //字母幻灯片 
 54     {
 55         if(QAQ[i].top==0) return 0; //如果没有数字幻灯片与其对应,则该题无法做 
 56         if(QAQ[i].top==1)
 57         {
 58             QwQ[++head]=i; //将‘i+64‘字母幻灯片入栈 
 59         }
 60     }
 61     if(head==0) return 0; //如果字母幻灯片中没有一一对应的幻灯片,说明形成了环,则该题无法做 
 62     do 
 63     {
 64         int s=QwQ[head];//字母幻灯片
 65         head--; //弹出 
 66         for(int k=1;k<=n;k++)
 67         {
 68             if(vis[s][k])
 69             {
 70                 anse=QAQ[s].ans=k;//记录答案,便于输出 
 71             }
 72         }
 73         for(int x=1;x<=n;x++)
 74         {
 75             if(vis[x][anse])//如果‘x+64‘张幻灯片与 
 76             {
 77                 vis[x][anse]=0;//消除标记 
 78                 QAQ[x].shanchu();//个数-- 
 79                 if(QAQ[x].top==1) QwQ[++head]=x;//若再发现一一对应的幻灯片,入栈 
 80             }
 81         }
 82     }while(head>0);
 83     for(int i=1;i<=n;i++)//判断是否有结果,有则进行输出 
 84         if(!QAQ[i].ans) return 0;
 85     return 1; 
 86 }
 87 
 88 void Q_print()
 89 {
 90     for(int i=1;i<=n;i++)
 91     {
 92         cout<<char(i+64);
 93         //cout<<" ";
 94         cout<<QAQ[i].ans<<endl;
 95     }
 96 }
 97 
 98 int main()
 99 {
100     Q_in();
101     if(!Q_topos()) printf("None");
102     else Q_print();
103     return 0;
104 }

还有一种暴力代码:

(ps:偷得代码啦)

上面如果看不懂的话,就试试暴力吧~(不好意思注释懒得打了……)

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 struct node
  7 {
  8     int n,num,xx,yy;
  9 }aa[10001];
 10 int a[10001][5];
 11 struct rrrr{
 12     int numm;bool aaa[1001];
 13 }rudu[10001];
 14 int cmp(const node & ac,const node & bc)
 15 {
 16     if(ac.num<bc.num)return 1;
 17     else return 0;
 18 }
 19 int main()
 20 {
 21     int n;
 22     scanf("%d",&n);
 23     for(int i=1;i<=n;i++)
 24     {
 25         for(int j=1;j<=4;j++)
 26         scanf("%d",&a[i][j]);
 27     }
 28     int x,y;
 29     int ans[1001];
 30     int vis[1001];
 31     for(int i=1;i<=n;i++)
 32     {
 33         scanf("%d%d",&x,&y);
 34         aa[i].n=i;
 35         aa[i].xx=x;
 36         aa[i].yy=y;
 37         for(int j=1;j<=n;j++)
 38             if(x>=a[j][1]&&x<=a[j][2]&&y>=a[j][3]&&y<=a[j][4])
 39             {
 40                 aa[i].num++;
 41                 rudu[j].numm++;
 42                 rudu[j].aaa[i]=1;
 43             }
 44     }
 45     int tot=0;
 46     int flagg=0;
 47     for(int i=1;i<=n;i++)
 48     {
 49         if(rudu[i].numm==1)
 50         {
 51              flagg++;
 52         }    
 53     }
 54     if(flagg!=1)
 55     {
 56         printf("None");
 57         return 0;
 58     }
 59     sort(aa+1,aa+n+1,cmp);
 60     for(int i=1;i<=n;i++)
 61     {
 62         for(int j=1;j<=n;j++)
 63         {
 64             if(aa[i].xx>=a[j][1]&&aa[i].xx<=a[j][2]&&aa[i].yy>=a[j][3]&&aa[i].yy<=a[j][4]&&!vis[j])
 65             {
 66             vis[j]=1;
 67             ans[j]=aa[i].n;
 68             tot++;
 69             break;
 70             }
 71         }
 72         for(int q=1;q<=n;q++)
 73         if(rudu[q].aaa[aa[i].n]==1)
 74         {
 75             rudu[q].aaa[aa[i].n]=0;
 76             rudu[q].numm--;
 77         }
 78     }
 79     int flag=0;
 80     for(int i=1;i<=n;i++)
 81     {
 82         if(rudu[i].numm!=0)
 83         {
 84          flag=1;
 85          break;    
 86         }
 87     }
 88     if(tot!=n||flag)
 89     {
 90         printf("None");
 91         return 0;
 92     }
 93     else 
 94     for(int i=1;i<=n;i++)
 95     {
 96         printf("%c",i+64);
 97         printf("%d",ans[i]);
 98         cout<<endl;
 99     }
100     return 0;
101 }

 

以上是关于PID221 / 烦人的幻灯片☆ x的主要内容,如果未能解决你的问题,请参考以下文章

PID221 / 烦人的幻灯片 ☆

SID1190471 / 烦人的幻灯片 暴力出奇迹 !!!!!!!!!!!!!!!!!!

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

烦人的幻灯片(slides)

拓扑排序——烦人的幻灯片

4735 烦人的幻灯片 (拓扑)