洛谷P1003 铺地毯 noip2011提高组day1T1
洛谷P1003 鋪地毯 noip2011提高組day1T1?
洛谷原題
題目描述
為了準備一個獨特的頒獎典禮,組織者在會場的一片矩形區域(可看做是平面直角坐標系的第一象限)鋪上一些矩形地毯。一共有 n 張地毯,編號從 1 到n。現在將這些地毯按照編號從小到大的順序平行于坐標軸先后鋪設,后鋪的地毯覆蓋在前面已經鋪好的地毯之上。
地毯鋪設完成后,組織者想知道覆蓋地面某個點的最上面的那張地毯的編號。注意:在矩形地毯邊界和四個頂點上的點也算被地毯覆蓋。
輸入輸出格式
輸入格式
輸入共n+2行
第一行,一個整數n,表示總共有n張地毯
接下來的n行中,第 i+1 表示編號i的地毯的信息,包含四個正整數a,b,g,k.每兩個整數之間用一個空格隔開,分別表示鋪設地毯的左下角的坐標(a,b)以及地毯在x軸和y軸方向的長度
第n+2行包含兩個正整數x和y,表示所求的地面的點的坐標(x,y)
輸出格式
輸出共1行,一個整數,表示所求的地毯的編號;若此處沒有被地毯覆蓋則輸出-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數組特別是二維數組需要注意不超過10^8
輸出時的判斷是什么鬼?
然后就沒什么重要的了。
思想就是,當我輸入每一個地毯時,遍歷其所在的地面,把它們的值變成那塊地毯的名字
好開心呀!
BUT......
等了好久才出結果,果然沒過。。。
?
MLE:Memory Limit Exceeded,超出內存限制。
洛谷各個評測狀態
要不要看看#2有多大?
因為博客園不能放txt,我就直接加了個后綴名(.ppt)上去
這是輸出
#2就這么大了?!?!10000個數???
內存太大?要不試試離散化?
不知名的方法
取名好難,放過我吧。。。
其實嘛,我不用老是去遍歷遍歷的,要是有一萬張地毯,每張地毯大小都在1000*1000左右,那豈不是一共要遍歷10^10遍?
為什么不把每張地毯數據放在四個數組里(a,b,g,k),然后再判斷(x,y)在不在地毯范圍內?
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)的地毯,不管其他的。各有優缺吧?
?
有個小坑
當我想到"不知名的方法"時,為什么不可以像暴力法那樣,一邊輸入a,b,g,k,一邊判斷(x,y)在不在內部呢?
因為x和y時最后輸的。。。。。。
再改進
方法二(名字好長不想打,以下均同)中,第二個for循環是從1~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
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的洛谷P1003 铺地毯 noip2011提高组day1T1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 事务框架之声明事务(自动开启,自动提交,
- 下一篇: 【洛谷 2782】友好城市