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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

洛谷P1003 铺地毯 noip2011提高组day1T1

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

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

洛谷原題

題目描述

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

地毯鋪設(shè)完成后,組織者想知道覆蓋地面某個(gè)點(diǎn)的最上面的那張地毯的編號(hào)。注意:在矩形地毯邊界和四個(gè)頂點(diǎn)上的點(diǎn)也算被地毯覆蓋。

輸入輸出格式

輸入格式

輸入共n+2行

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

接下來(lái)的n行中,第 i+1 表示編號(hào)i的地毯的信息,包含四個(gè)正整數(shù)a,b,g,k.每?jī)蓚€(gè)整數(shù)之間用一個(gè)空格隔開(kāi),分別表示鋪設(shè)地毯的左下角的坐標(biāo)(a,b)以及地毯在x軸和y軸方向的長(zhǎng)度

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

輸出格式

輸出共1行,一個(gè)整數(shù),表示所求的地毯的編號(hào);若此處沒(méi)有被地毯覆蓋則輸出-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


?題解


暴力法

這不,第一反應(yīng)就是暴力嘛!

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]為什么不開(kāi)大一點(diǎn)?

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

輸出時(shí)的判斷是什么鬼?

然后就沒(méi)什么重要的了。

思想就是,當(dāng)我輸入每一個(gè)地毯時(shí),遍歷其所在的地面,把它們的值變成那塊地毯的名字

好開(kāi)心呀!

BUT......

等了好久才出結(jié)果,果然沒(méi)過(guò)。。。

?

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

洛谷各個(gè)評(píng)測(cè)狀態(tài)

要不要看看#2有多大?

因?yàn)椴┛蛨@不能放txt,我就直接加了個(gè)后綴名(.ppt)上去

這是輸出

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

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


不知名的方法

取名好難,放過(guò)我吧。。。

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

為什么不把每張地毯數(shù)據(jù)放在四個(gè)數(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 }

?

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

?

有個(gè)小坑

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

因?yàn)閤和y時(shí)最后輸?shù)摹!!?。?!?/p>


再改進(jìn)

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

但是我們要的是最后一個(gè)地毯呀!

倒著循環(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 }

?天才如我呀哈哈哈!


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

轉(zhuǎn)載于:https://www.cnblogs.com/send-off-a-friend/p/11138847.html

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

總結(jié)

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

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