安排电影院座位——搜索 Codeforces Beta Round #10 B Cinema Cashier

给你电影院长宽K
然后给你N给问题请你分配位子
要求权值最小
在权值相同时按I取最小
还是相同就按J最小
暴力搜索下就行
不难,但是用等差公式算时没考虑周到。。。
View Code
#include<stdio.h>
#include
<math.h>
#include
<string.h>

int ll[1009];
bool map[109][109];

int main()
{
int n,len;
memset(map,
0,sizeof(map));
scanf(
"%d%d",&n,&len);

int i2=(len+1)/2;
int j2=(len+1)/2;

int i,j;

for(i=1;i<=n;i++)
{
scanf(
"%d",&ll[i]);
}

int k,p;

for(k=1;k<=n;k++)
{
int min=99999999;
int ri,rj;
for(i=1;i<=len;i++)
{
for(j=1;j<=len;j++)
{
if(j+ll[k]-1>len) break;

int ok=0;
for(p=0;p<ll[k];p++)
{
if(map[i][j+p]==1)
{
j
=j+p;
ok
=1;
break;
}
}
if(ok==0)
{
int all=0;
if(j+ll[k]-1<=j2)
{
all
=(2*j2-2*j-ll[k]+1)*ll[k]/2+abs(i-i2)*ll[k];
}
else if(j>=j2)
{
all
=(2*j-2*j2+ll[k]-1)*ll[k]/2+abs(i-i2)*ll[k];
}
else
{
all
=(j2-j)*(j2-j+1)/2+(j+ll[k]-1-j2)*(j+ll[k]-j2)/2+abs(i-i2)*ll[k];
}

if(min>all)
{
min
=all;
ri
=i;
rj
=j;
}
}
}
}

if(min==99999999)
{
printf(
"-1\n");
}
else
{
printf(
"%d %d %d\n",ri,rj,rj+ll[k]-1);
for(p=0;p<ll[k];p++)
{
map[ri][rj
+p]=1;
}
}
}
}

  

原文地址:https://www.cnblogs.com/huhuuu/p/2109928.html