【鋪地毯】蒟蒻題解

原題:傳送門
ios


本蒟蒻的題解,讓大神們見笑了!

從上圖,你們能夠發現一點:後鋪的地毯要比先鋪的位置要更靠上,這點很重要。

\(OK\),開始進入代碼講解。

#include<iostream>
using namespace std;
int a[10001],b[10001],g[10001],k[10001],n,i,j,d,x,y;
int main()
{
    cin>>n;
    for(d=1;d<=n;d++)
        cin>>a[d]>>b[d]>>g[d]>>k[d];
    cin>>x>>y;

輸入部分沒什麼能夠講的,咋們就跳過了。

for(d=n;d>=1;d--)
        if(x>=a[d]&&x<=g[d]+a[d]&&y>=b[d]&&y<=k[d]+b[d])
        {
            cout<<d;
            return 0;
        }

(敲黑板)接下來是重點,注意看哦。

有的眼尖的朋友可能會發現:我是倒着循環的,這是一個涉及到貪心的一個小技巧,前面咱們也講到了,後鋪的地毯要比先鋪的位置要更靠上,那麼,從最後鋪的地毯開始查找,會更省時間。

而後呢,其實就是查找\((x,y)\)這個點是否是在這張地毯的範圍內,若是是,則直接輸出這張地毯的編號,而後\(return\)就好了。

cout<<"-1";
    return 0;
}

若是\((x,y)\)這個點上並無地毯,那麼直接輸出「\(-1\)」,表示:這個\((x,y)\)點上沒有鋪過地毯。

完整代碼以下:

#include<iostream>
using namespace std;
int a[10001],b[10001],g[10001],k[10001],n,i,j,d,x,y;
int main()
{
    cin>>n;
    for(d=1;d<=n;d++)
        cin>>a[d]>>b[d]>>g[d]>>k[d];
    cin>>x>>y;
    for(d=n;d>=1;d--)
        if(x>=a[d]&&x<=g[d]+a[d]&&y>=b[d]&&y<=k[d]+b[d])
        {
            cout<<d;
            return 0;
        }
    cout<<"-1";
    return 0;
}
相關文章
相關標籤/搜索