您的位置:首页 > 其它

试试CSDN的blog~

2009-11-13 10:43 218 查看
百度开了一个blog,但是因为文章字数限制,外加贴入的代码格式不好~

想换一个试试

POJ的一道题

http://acm.pku.edu.cn/JudgeOnline/problem?id=1065

首先对棍子按长度从小到大排序,在长度相等的情况下再按重量由小到大对棍子排序

然后从第一跟棍子(长度最小,重量在同长度中最小)开始,

如果该棍子没被使用过,依次考察后面的没被使用的棍子,如果重量大于等于它的重量,长度大于等于它的长度,则将两跟棍子安排在一个序列中,并将加入序列的棍子置已使用标志。

直到所有棍子都使用完,则序列数即为所需的最小准备时间 (这个为啥是最短时间,不懂?)

#include<stdio.h>
#include<stdlib.h>

typedef struct D {
int l;
int w;
} Data;

Data data[5000];
int min = 5005;
bool flag[5000];
int cmp( const void *a , const void *b)
{
int i = ((Data *)a)->l - ((Data *)b)->l ;
if(i == 0)
return ((Data *)a)->w - ((Data *)b)->w ;
else
return i;
}

int main()
{
int n, num;
scanf("%d", &n);
for(int i=0; i<n; i++)
{
scanf("%d", &num);
for(int j=0; j<num; j++)
{
scanf("%d",&data[j].l);
scanf("%d",&data[j].w);
}

qsort(data, num, sizeof(Data), cmp); //由小到大快排

for(int i=0; i<num; i++)
flag[i] = false;
int result = 0;
for(int i=0; i<num; i++)
{
if(!flag[i])
{
flag[i] = true;
int temp = i;
result++;
for(int j=i; j<num; j++)
{
if(!flag[j])
{
if(data[j].w >= data[temp].w)
{
flag[j] = true;
temp = j;
}
}
}
}
}

printf("%d/n", result);
}
return 0;
}


如何证明贪心可得最优解?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: