铺地毯蒟蒻题解

Posted clear-skies

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了铺地毯蒟蒻题解相关的知识,希望对你有一定的参考价值。

原题:传送门
技术图片


本蒟蒻的题解,让大神们见笑了!

从上图,大家可以发现一点:后铺的地毯要比先铺的位置要更靠上,这点很重要。

(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;
}

以上是关于铺地毯蒟蒻题解的主要内容,如果未能解决你的问题,请参考以下文章

luoguP1003 铺地毯 题解(NOIP2011)

洛谷 1003 NOIP2011 D1T1 铺地毯

NOIP201105铺地毯

vijos1736-铺地毯

c++铺地毯

铺地毯(取最上层的地毯)