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