洛谷P1003 铺地毯 noip2011提高组day1T1
洛谷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)題。
- 上一篇: 事务框架之声明事务(自动开启,自动提交,
- 下一篇: 【洛谷 2782】友好城市