noip2011day1题解
描述
為了準備一個獨特的頒獎典禮,組織者在會場的一片矩形區域(可看做是平面直角坐標系的第一象限)鋪上一些矩形地毯。一共有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。
描述
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题解的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: CSS实现树形结构 + js加载数据
- 下一篇: Redis学习第五课:Redis Set
