日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

noip2011day1题解

發布時間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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。

所謂單調棧,我也不知道我當時是寫了些什么,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题解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。