Seat taking up is tough(hdu 3262 模拟题 easy

http://acm.hdu.edu.cn/showproblem.php?pid=3262

题意 :占位置 必须连续 在这个条件下找到最左边的舒适值最大(因为自己坐)

如果占不到连续的p个 那么就只占一个自己的位置

都占不到输出-1

题解:就单纯for循环 一行行找过去 一行里面有(列数-要占的连续位置数+1)种连续的情况,每种排查过去 如果都是空位置就可以占,还要设个maxx找到最大值

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int idd,time,h,m,q;
}a[55];
bool cmp(node x,node y)
{
    return x.time<y.time;
}
int mp[55][55];
int main()
{
    int i,j,n,m,k;
    while(scanf("%d%d%d",&n,&m,&k),n||m||k)
    {
        memset(mp,-1,sizeof(mp));
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                scanf("%d",&mp[i][j]);
            }
        }
        for(i=1;i<=k;i++)
        {
            scanf("%d:%d %d",&a[i].h,&a[i].m,&a[i].q);
            a[i].idd=i;
            a[i].time=a[i].h*60+a[i].m;
        }
        sort(a+1,a+1+k,cmp);//注意 排序之后 输出要按原输入顺序输出
        vector<int>ve[55];
        for(i=1;i<=k;i++)
        {
            int p=a[i].q;
            int maxx=-0x3f3f3f3f;
            int maxydw1=0,maxydw2=0;
            for(j=1;j<=n;j++)
            {
                int gs=m-p+1;
                for(int o=1;o<=gs;o++)
                {
                    int f=1;
                    for(int q1=o;q1<=o+p-1;q1++)//一开始这里写错了  找了好久
                    {
                        if(mp[j][q1]==-1)f=0;
                    }
                    if(f==1&&mp[j][o]>maxx)
                    {
                        maxx=mp[j][o];
                        maxydw1=j;
                        maxydw2=o;
                    }
                }
            }
            if(maxydw1!=0)
            {
                int po=maxydw2+p-1;
                for(int o=maxydw2;o<=po;o++)
                {
                    mp[maxydw1][o]=-1;
                }
                ve[a[i].idd].push_back(maxydw1);
                ve[a[i].idd].push_back(maxydw2);
            }
            else
            {
                int mx=0,my=0,maxxx=-0x3f3f3f3f;
                for(int q1=1;q1<=n;q1++)
                {
                    for(int q2=1;q2<=m;q2++)
                    {
                        if(mp[q1][q2]!=-1&&mp[q1][q2]>maxxx)
                        {
                            maxxx=mp[q1][q2];
                            mx=q1,my=q2;
                        }
                    }
                }
                if(mx!=0)ve[a[i].idd].push_back(mx),ve[a[i].idd].push_back(my),mp[mx][my]=-1;
                else ve[a[i].idd].push_back(-1);
            }
        }
        for(i=1;i<=k;i++)
        {
            if(ve[i].size()==1)cout<<-1<<endl;
            else cout<<ve[i][0]<<" "<<ve[i][1]<<endl;
        }
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/ydw--/p/11348287.html