日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

洛谷P1003 铺地毯 noip2011提高组day1T1

發(fā)布時間:2025/5/22 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷P1003 铺地毯 noip2011提高组day1T1 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

洛谷P1003 鋪地毯 noip2011提高組day1T1?

洛谷原題

題目描述

為了準備一個獨特的頒獎典禮,組織者在會場的一片矩形區(qū)域(可看做是平面直角坐標系的第一象限)鋪上一些矩形地毯。一共有 n 張地毯,編號從 1 到n。現(xiàn)在將這些地毯按照編號從小到大的順序平行于坐標軸先后鋪設,后鋪的地毯覆蓋在前面已經(jīng)鋪好的地毯之上。

地毯鋪設完成后,組織者想知道覆蓋地面某個點的最上面的那張地毯的編號。注意:在矩形地毯邊界和四個頂點上的點也算被地毯覆蓋。

輸入輸出格式

輸入格式

輸入共n+2行

第一行,一個整數(shù)n,表示總共有n張地毯

接下來的n行中,第 i+1 表示編號i的地毯的信息,包含四個正整數(shù)a,b,g,k.每兩個整數(shù)之間用一個空格隔開,分別表示鋪設地毯的左下角的坐標(a,b)以及地毯在x軸和y軸方向的長度

第n+2行包含兩個正整數(shù)x和y,表示所求的地面的點的坐標(x,y)

輸出格式

輸出共1行,一個整數(shù),表示所求的地毯的編號;若此處沒有被地毯覆蓋則輸出-1

輸入輸出樣例

輸入樣例#1:
1 0 2 3
0 2 3 3
2 1 3 3
2 2
輸出樣例#1:
3

輸入樣例#2:
3
1 0 2 3
0 2 3 3
2 1 3 3
4 5
輸出樣例#2:
-1


?題解


暴力法

這不,第一反應就是暴力嘛!

1 //洛谷P1003 鋪地毯 noip2011提高組day1T1 2 #include<iostream> 3 using namespace std; 4 int dm[10000][10000],ta,tb,tg,tk; 5 int main(){ 6 int n,x,y; 7 cin>>n; 8 for(int i=1;i<=n;i++){ 9 cin>>ta>>tb>>tg>>tk; 10 for(int j=ta;j<ta+tg;j++) 11 for(int m=tb;m<tb+tk;m++) 12 dm[j][m]=i; 13 } 14 cin>>x>>y; 15 if(dm[x][y]) cout<<dm[x][y]; 16 else cout<<"-1"; 17 return 0; 18 }

?

解釋一下:

dt[10000][10000]為什么不開大一點?

開int數(shù)組特別是二維數(shù)組需要注意不超過10^8

輸出時的判斷是什么鬼?

然后就沒什么重要的了。

思想就是,當我輸入每一個地毯時,遍歷其所在的地面,把它們的值變成那塊地毯的名字

好開心呀!

BUT......

等了好久才出結果,果然沒過。。。

?

MLE:Memory Limit Exceeded,超出內(nèi)存限制。

洛谷各個評測狀態(tài)

要不要看看#2有多大?

因為博客園不能放txt,我就直接加了個后綴名(.ppt)上去

這是輸出

#2就這么大了?!?!10000個數(shù)???

內(nèi)存太大?要不試試離散化?


不知名的方法

取名好難,放過我吧。。。

其實嘛,我不用老是去遍歷遍歷的,要是有一萬張地毯,每張地毯大小都在1000*1000左右,那豈不是一共要遍歷10^10遍?

為什么不把每張地毯數(shù)據(jù)放在四個數(shù)組里(a,b,g,k),然后再判斷(x,y)在不在地毯范圍內(nèi)?

1 //洛谷P1003 鋪地毯 noip2011提高組day1T1 2 #include<iostream> 3 using namespace std; 4 int main(){ 5 int n,x,y,xy=-1; 6 cin>>n; 7 int a[n],b[n],g[n],k[n]; 8 for(int i=1;i<=n;i++) 9 cin>>a[i-1]>>b[i-1]>>g[i-1]>>k[i-1]; 10 cin>>x>>y; 11 for(int j=1;j<=n;j++){ 12 if(a[j-1]<=x&&a[j-1]+g[j-1]>=x) 13 if(b[j-1]<=y&&b[j-1]+k[j-1]>=y) 14 xy=j; 15 } 16 cout<<xy; 17 return 0; 18 }

?

這個方法與上一個最大的不同在于,暴力法可以得到每一個坐標的最上面的地毯號,而"不知名的方法"只算(x,y)的地毯,不管其他的。各有優(yōu)缺吧?

?

有個小坑

當我想到"不知名的方法"時,為什么不可以像暴力法那樣,一邊輸入a,b,g,k,一邊判斷(x,y)在不在內(nèi)部呢?

因為x和y時最后輸?shù)摹!!!!!?/p>


再改進

方法二(名字好長不想打,以下均同)中,第二個for循環(huán)是從1~n的。

但是我們要的是最后一個地毯呀!

倒著循環(huán)唄?

1 //洛谷P1003 鋪地毯 noip2011提高組day1T1 2 #include<iostream> 3 using namespace std; 4 int main(){ 5 int n,x,y,xy=-1; 6 cin>>n; 7 int a[n],b[n],g[n],k[n]; 8 for(int i=1;i<=n;i++) 9 cin>>a[i-1]>>b[i-1]>>g[i-1]>>k[i-1]; 10 cin>>x>>y; 11 for(int j=n;j>=1;j--){ 12 if(a[j-1]<=x&&a[j-1]+g[j-1]>=x) 13 if(b[j-1]<=y&&b[j-1]+k[j-1]>=y) 14 { 15 xy=j; 16 break; 17 } 18 } 19 cout<<xy; 20 return 0; 21 }

?天才如我呀哈哈哈!


把一道題做出了三種方法。。。我是不是神了???

轉載于:https://www.cnblogs.com/send-off-a-friend/p/11138847.html

《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的洛谷P1003 铺地毯 noip2011提高组day1T1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。