描述

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有n张地毯,编号从1到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。

格式

输入格式

输入共n+2行。

第一行,一个整数n(0 <= n <= 10,000),表示总共有n张地毯。

接下来的n行中,第i+1行表示编号i的地毯的信息,包含四个正整数a,b,g,k(0 <= a, b, g, k <= 100,000),每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y轴方向的长度。

第n+2行包含两个正整数x和y,表示所求的地面的点的坐标(x,y)。

输出格式

输出共1行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。

样例1

样例输入1[复制]

3
1 0 2 3
0 2 3 3
2 1 3 3
2 2

样例输出1[复制]

3

样例2

样例输入2[复制]

3
1 0 2 3
0 2 3 3
2 1 3 3
4 5

样例输出2[复制]

-1

限制

1s

 1 #include<stdio.h>
 2 #include<iostream>
 3 using namespace std;
 4 int n,map[10005][4],a,b,ans=-2;
 5
 6 int main()
 7 {
 8     cin>>n;
 9     for(int i=0;i<n;i++)
10      cin>>map[i][0]>>map[i][1]>>map[i][2]>>map[i][3];
11     cin>>a>>b;
12
13     for(int i=0;i<n;i++)
14      if(map[i][0]<=a&&map[i][1]<=b&&map[i][0]+map[i][2]>=a&&map[i][1]+map[i][3]>=b)ans=i;
15
16     cout<<ans+1;
17     return 0;
18 }

描述

丽江河边有n家很有特色的客栈,客栈按照其位置顺序从1到n编号。每家客栈都按照某一种色调进行装饰(总共k种,用整数0~ k-1表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。

两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过p。

他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过p元的咖啡店小聚。

格式

输入格式

第一行三个整数n,k,p,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;
接下来的n行,第i+1行两个整数,之间用一个空格隔开,分别表示i号客栈的装饰色调和i号客栈的咖啡店的最低消费。

输出格式

输出只有一行,一个整数,表示可选的住宿方案的总数。

样例1

样例输入1[复制]

5 2 3
0 5
1 3
0 2
1 4
1 5

样例输出1[复制]

3

限制

1s

提示

对于30%的数据,有n≤100;
对于50%的数据,有n≤1,000;
对于100%的数据,有2≤n≤200,000,0<k≤50,0≤p≤100,0≤最低消费≤100。

所谓单调栈,我也不知道我当时是写了些什么,idea题?

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 using namespace std;
 5
 6 int N,K,P;
 7 int ans;
 8 int a[200005];
 9 int b[60];
10
11 int main()
12 {
13     scanf("%d%d%d",&N,&K,&P);
14     for(int i=0;i<N;i++)
15     {
16         int cost,k;
17         scanf("%d%d",&k,&cost);
18         if(cost>P)
19         {
20             if(b[k]==0)
21              a[k]++;
22             if(b[k]>0)
23             {
24                 ans+=b[k];
25                 a[k]++;
26             }
27         }
28         if(cost<=P)
29         {
30             a[k]++;
31             for(int j=0;j<K;j++)
32             {
33                 b[j]+=a[j];
34                 a[j]=0;
35             }
36             ans+=(b[k]-1);
37         }
38     }
39     printf("%d",ans);
40     return 0;
41 }

描述

Mayan puzzle是最近流行起来的一个游戏。游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下:

1、每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见图6到图7);如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落(直到不悬空,参见图1和图2);

2、任一时刻,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除(参见图1到图3)。

注意:
a) 如果同时有多组方块满足消除条件,几组方块会同时被消除(例如下面图4,三个颜色为1的方块和三个颜色为2的方块会同时被消除,最后剩下一个颜色为2的方块)。

b) 当出现行和列都满足消除条件且行列共享某个方块时,行和列上满足消除条件的所有方块会被同时消除(例如下面图5所示的情形,5个方块会同时被消除)。

3、方块消除之后,消除位置之上的方块将掉落,掉落后可能会引起新的方块消除。注意:掉落的过程中将不会有方块的消除。

上面图1到图3给出了在棋盘上移动一块方块之后棋盘的变化。棋盘的左下角方块的坐标为(0, 0),将位于(3, 3)的方块向左移动之后,游戏界面从图1变成图2所示的状态,此时在一竖列上有连续三块颜色为4的方块,满足消除条件,消除连续3块颜色为4的方块后,上方的颜色为3的方块掉落,形成图3所示的局面。

格式

输入格式

第一行为一个正整数n,表示要求游戏关的步数。

接下来的5行,描述7*5的游戏界面。每行若干个整数,每两个整数之间用一个空格隔开,每行以一个0 结束,自下向上表示每竖列方块的颜色编号(颜色不多于10种,从1开始顺序编号,相同数字表示相同颜色)。

输入数据保证初始棋盘中没有可以消除的方块。

输出格式

如果有解决方案,输出n行,每行包含3个整数x,y,g,表示一次移动,每两个整数之间用一个空格隔开,其中(x,y)表示要移动的方块的坐标,g表示移动的方向,1表示向右移动,-1表示向左移动。注意:多组解时,按照x为第一关键字,y为第二关键字,1优先于-1,给出一组字典序最小的解。游戏界面左下角的坐标为(0, 0)。
如果没有解决方案,输出一行,包含一个整数-1。

样例1

样例输入1[复制]

3
1 0
2 1 0
2 3 4 0
3 1 0
2 4 3 4 0

样例输出1[复制]

2 1 1
3 1 1
3 0 1

限制

3s

提示

样例输入的游戏局面如图6到图11所示。依次移动的三步是:(2,1)处的方格向右移动,(3,1)处的方格向右移动,(3,0)处的方格向右移动,最后可以将棋盘上所有方块消除。

数据规模如下:
对于30%的数据,初始棋盘上的方块都在棋盘的最下面一行;
对于100%的数据,0 < n ≤ 5。

大模拟

  1 #include<iostream>
  2 #include<string.h>
  3 #include<stdio.h>
  4 #include<cstdlib>
  5 #include<algorithm>
  6 #define n 7
  7 #define m 5
  8 #define c 10
  9 using namespace std;
 10 int nowmap[n+1][m+1];
 11 int t;
 12 int now[40][3];
 13
 14 int check()
 15 {
 16     int cnt[c];
 17     memset(cnt,0,sizeof(cnt));
 18     for(int i=0;i<n;i++)
 19      for(int j=0;j<m;j++)
 20       cnt[nowmap[i][j]]++;
 21     for(int i=1;i<c;i++)
 22      if(cnt[i]>0&&cnt[i]<3)
 23       return -1;
 24     for(int i=0;i<n;i++)
 25      for(int j=0;j<m;j++)
 26       if(nowmap[i][j]!=0)
 27        return 0;
 28     return 1;
 29 }
 30
 31 void out()
 32 {
 33     cout<<"nowmap:"<<endl;
 34     for(int i=0;i<n;i++)
 35     {
 36          for(int j=0;j<m;j++)
 37           cout<<nowmap[i][j]<<" ";
 38          cout<<endl;
 39     }
 40 }
 41
 42 void up(int j)
 43 {
 44     for(int i=0;i<n;i++)
 45      if(nowmap[i][j]==0)
 46      {
 47          int k=i;
 48          while(k<n)
 49          {
 50              k++;
 51              if(nowmap[k][j]!=0)
 52              {
 53                   swap(nowmap[i][j],nowmap[k][j]);
 54                   break;
 55              }
 56         }
 57      }
 58 }
 59
 60 int clean()
 61 {
 62     int flag[n][m];
 63     for(int i=0;i<n;i++)
 64      for(int j=0;j<m;j++)
 65       flag[i][j]=0;
 66     for(int i=0;i<n;i++)
 67      for(int j=0;nowmap[i][j+2]!=0;j++)
 68       if(nowmap[i][j]==nowmap[i][j+1]&&nowmap[i][j]==nowmap[i][j+2])
 69        flag[i][j]=flag[i][j+1]=flag[i][j+2]=1;
 70     for(int j=0;j<m;j++)
 71      for(int i=0;nowmap[i+2][j]!=0;i++)
 72       if(nowmap[i][j]==nowmap[i+1][j]&&nowmap[i][j]==nowmap[i+2][j])
 73        flag[i][j]=flag[i+1][j]=flag[i+2][j]=1;
 74     int mark=0;
 75     for(int j=0;j<m;j++)
 76     {
 77         int mar=0;
 78         for(int i=0;i<n;i++)
 79          if(flag[i][j]==1)
 80           mar=mark=1,nowmap[i][j]=0;
 81         if(mar)
 82          up(j);
 83     }
 84     return mark;
 85 }
 86
 87 void does(int x,int y,int p,int deep)
 88 {
 89     now[deep][0]=y;
 90     now[deep][1]=x;
 91     now[deep][2]=p;
 92     swap(nowmap[x][y],nowmap[x][y+p]);
 93     up(y);
 94     up(y+p);
 95     while(1)
 96      if(clean()==0)
 97       break;
 98 }
 99
100 void DFS(int deep)
101 {
102     int thi=check();
103     if(thi==1)
104     {
105         for(int i=0;i<deep;i++)
106         {
107              for(int j=0;j<3;j++)
108               cout<<now[i][j]<<" ";
109              cout<<endl;
110         }
111         exit(0);
112     }
113     if(thi==-1)
114      return ;
115     if(deep>=t)
116      return ;
117     int record[n+1][m+1];
118     memcpy(record,nowmap,sizeof(nowmap));
119     for(int j=0;j<m;j++)
120      for(int i=0;i<n;i++)
121      {
122           if(nowmap[i][j]!=0&&j!=m-1&&nowmap[i][j]!=nowmap[i][j+1])
123           {
124               does(i,j,1,deep);
125               DFS(deep+1);
126               memcpy(nowmap,record,sizeof(record));
127           }
128         if(nowmap[i][j]==0&&j!=m-1&&nowmap[i][j+1]!=0)
129         {
130             does(i,j+1,-1,deep);
131             DFS(deep+1);
132             memcpy(nowmap,record,sizeof(record));
133         }
134      }
135 }
136
137 int main()
138 {
139     scanf("%d",&t);
140     for(int j=0;j<m;j++)
141      for(int i=0;;i++)
142      {
143         scanf("%d",&nowmap[i][j]);
144         if(nowmap[i][j]==0)
145          break;
146      }
147     DFS(0);
148     cout<<"-1"<<endl;
149     return 0;
150 }

转载于:https://www.cnblogs.com/zyx45889/p/6075270.html

noip2011day1题解相关推荐

  1. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  2. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  3. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  4. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  5. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  6. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  7. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  8. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  9. 【题解搬运】PAT_L1-009 N个数求和

    从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...

最新文章

  1. loadrunner controller:实时查看VUser的运行情况
  2. mysql 主键唯一,MySQL。关键表中的主键。唯一ID还是多个唯一键?
  3. 关于Spring 任务调度之task:scheduler与task:executor配置的详解
  4. Memcheck:一个内存错误检测器
  5. zeromq+python安装手册
  6. MySQL设置数据格为空白或NULL
  7. [原]gcc 中c实现所定义的特征
  8. 凸优化第七章统计估计 7.1 参数分布估计
  9. 公司应该鼓励怎样的内斗
  10. ASCII码 编码对照表
  11. 如何用java语言编写小游戏?(一)
  12. c语言 pow函数及pow函数的错误情况
  13. 世界各国与中国时差查询
  14. [轻笔记] SHAP值的计算步骤
  15. Java自学经验分享
  16. 怕扫描王泄露数据?5分钟自建一个文档扫描器。——基于opencv
  17. java 营业执照图片内容识别
  18. 2006-07-16蜡肉的吃法(不完全)
  19. 设置Android默认锁定屏幕旋转
  20. 即时通信回弹 android,放大10倍看华为 P30,看完“真像”的你可能和我一样放弃 P30Pro...

热门文章

  1. 为什么使用中间件下载时总是收到警告消息Object is in status Wait
  2. php idwork,idwork.php
  3. 用pc装华为服务器系统,pc安装服务器系统安装
  4. android app复制,手机屏幕文字复制App(Text on sreen)
  5. matlab柱状图加阴影,matlab 绘制 阴影 柱状图 条形图
  6. dll已加载但找不到入口点dllregisterserver_Java 是如何加载类的?
  7. 二叉树展开为链表Python解法
  8. sarscape 将dem文件转化成stl_STL源码剖析 阅读笔记(一)介绍
  9. 基于matlab的状态反馈与极点配置
  10. 计算机工程信息学院严翔,严翔校长第六次大师课