贪心构造——81.D. Polycarp's Picture Gallery

如何安排相片,使相片尽量能放入几个给定的箱子里(体积不同),但是条件是,每个箱子里的照片不能相邻:如第一张,第二张不能同时放到一个箱子里,而且第一张与最后一张也不能在一起!!!错了N久,解决方法就是尽量把不能最后放的箱子在前面用掉
1.按每个箱子剩余容积排序
放入第一张到一个箱子里
2.每放入一张照片前,先拿第一张所放入的箱子号去放(为了使第一张与最后一张不能相邻),如不行则再按每个箱子剩余容积排序,选择符合的箱子去放
View Code
#include<iostream>
#include
<cstdio>
#include
<algorithm>
using namespace std;

struct data
{
int v;
int no;
int top;
}qun[
49];

int ji[49];
int q[1009];

int cmp(data a,data b)
{
if(a.v==b.v)
return a.no<b.no;
return a.v>b.v;
}


int main()
{
int n,m;
scanf(
"%d%d",&n,&m);

int i,j;
for(i=0;i<m;i++)
{
scanf(
"%d",&qun[i].v);
qun[i].no
=i;
qun[i].top
=-1;
}



int add=0;
sort(
&qun[0],&qun[m],cmp);
qun[
0].v--;
qun[
0].top=0;
q[add]
=qun[0].no;
add
++;

bool xia=0;
for(i=1;i<n;i++)
{
bool su=0;
sort(
&qun[0],&qun[m],cmp);

if(i+1!=n)//不是最后一个的情况下,先把与第一个号码一样的送出去,防止首位相邻
for(j=0;j<m;j++)
{
if(qun[j].no==q[0])
{
if((i-qun[j].top)!=1&&qun[j].v>=1)
{
qun[j].v
--;
qun[j].top
=i;
q[add]
=qun[j].no;
add
++;
su
=1;

}
break;
}
}

if(su==0)
for(j=0;j<m;j++)
{
if(i+1==n&&qun[j].no==q[0])//qun[0]因为排序过所以会变的qun[j].no==q[0]时头尾相邻了,舍去
continue;

if((i-qun[j].top)!=1&&qun[j].v>=1)
{
qun[j].v
--;
qun[j].top
=i;
q[add]
=qun[j].no;
add
++;
su
=1;
break;
}
}
if(su==0)
{
printf(
"-1\n");
return 0;
}
}


for(i=0;i<add;i++)
{
printf(
"%d ",q[i]+1);
}
printf(
"\n");
return 0;
}
如:6 3
1 2 3 
输出:
3 2 3 1 2 3 就错
而是:3 2 3 2 3 1
原文地址:https://www.cnblogs.com/huhuuu/p/2037771.html