贪心算法WOODENSTICKS实例代码
ProblemDescription
Thereisapileofnwoodensticks.Thelengthandweightofeachstickareknowninadvance.Thesticksaretobeprocessedbyawoodworkingmachineinonebyonefashion.Itneedssometime,calledsetuptime,forthemachinetoprepareprocessingastick.Thesetuptimesareassociatedwithcleaningoperationsandchangingtoolsandshapesinthemachine.Thesetuptimesofthewoodworkingmachinearegivenasfollows:
(a)Thesetuptimeforthefirstwoodenstickis1minute.(b)Rightafterprocessingastickoflengthlandweightw,themachinewillneednosetuptimeforastickoflengthl"andweightw"ifl<=l"andw<=w".Otherwise,itwillneed1minuteforsetup.
Youaretofindtheminimumsetuptimetoprocessagivenpileofnwoodensticks.Forexample,ifyouhavefivestickswhosepairsoflengthandweightare(4,9),(5,2),(2,1),(3,5),and(1,4),thentheminimumsetuptimeshouldbe2minutessincethereisasequenceofpairs(1,4),(3,5),(4,9),(2,1),(5,2).
Input
TheinputconsistsofTtestcases.Thenumberoftestcases(T)isgiveninthefirstlineoftheinputfile.Eachtestcaseconsistsoftwolines:Thefirstlinehasanintegern,1<=n<=5000,thatrepresentsthenumberofwoodensticksinthetestcase,andthesecondlinecontainsn2positiveintegersl1,w1,l2,w2,...,ln,wn,eachofmagnitudeatmost10000,whereliandwiarethelengthandweightoftheithwoodenstick,respectively.The2nintegersaredelimitedbyoneormorespaces.
Output
Theoutputshouldcontaintheminimumsetuptimeinminutes,oneperline.
SampleInput
35495221351432211223132231
SampleOutput
213
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#defineN5000;
structnode
{
intl;
intw;
intflag;
}sticks[5000];
intcmp(constvoid*p,constvoid*q)
{
structnode*a=(structnode*)p;
structnode*b=(structnode*)q;
if(a->l>b->l)return1;
elseif(a->l<b->l)return-1;
elsereturna->w>b->w?1:-1;
}
intmain()
{
intt,n,cnt,cl,cw;
inti,j;
scanf("%d",&t);
while(t--)
{
memset(sticks,0,sizeof(sticks));
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&sticks[i].l,&sticks[i].w);
qsort(sticks,n,sizeof(sticks[0]),cmp);
sticks[0].flag=1;
cl=sticks[0].l;
cw=sticks[0].w;
cnt=1;
for(j=1;j<n;j++)
{
for(i=j;i<n;i++)
{
if(!sticks[i].flag&&sticks[i].l>=cl&&sticks[i].w>=cw)
{
cl=sticks[i].l;
cw=sticks[i].w;
sticks[i].flag=1;
}
}
i=1;
while(sticks[i].flag)
i++;
j=i;
if(j==n)break;
cl=sticks[j].l;
cw=sticks[j].w;
sticks[j].flag=1;
cnt++;
}
printf("%d\n",cnt);
}
return0;
}
题意:
我们要处理一些木棍,第一根的时间是1分钟,另外的,在长度为l,重为w的木棍后面的那根的长度为l",重量w",只要l<=l"并且w<=w",就不需要时间,否则需要1分钟,求如何安排处理木棍的顺序,才能使花的时间最少。
思路:
贪心算法。先把这些木棍按长度和重量都从小到大的顺序排列。cl和cw是第一根的长度和重量,依次比较后面的是不是比当前的cl,cw大,是的话把标志flag设为1,并跟新cl,cw。比较完后,再从前往后扫描,找到第一个标志位为0的,作为是第二批的最小的一根,计数器加一。把它的长度和重量作为当前的cl,cw,再循环往后比较。直到所有的都处理了。
相关文章
- 【NLP基础】英文关键词抽取RAKE算法
- 实例分割算法_实例分割数据集制作
- 基本粒子群算法小结及算法实例(附Matlab代码)
- 遗传算法经典实例matlab_蚁群算法matlab实例
- java实现递归树形结构_java递归算法经典实例
- PAM_验证模块开发实例
- CVPR 2021 Oral | Transformer 跨界CV,美团提出端到端视频实例分割算法
- Oracle实例配置指南(Oracle配置实例)
- PHPMySQL精选实例指南: 快速学习和运用(phpmysql实例教程)
- jsp源码实例3(获取jsp各种参数)
- Android进阶篇-自定义图片伸缩控件具体实例
- C#的3DES加密解密算法实例代码
- python算法学习之计数排序实例
- 一组PHP可逆加密解密算法实例代码
- JavaScript排序算法之希尔排序的2个实例
- Python实现的Kmeans++算法实例
- pythonk-近邻算法实例分享
- PHP读取RSS(Feed)简单实例
- C#算法之全排列递归算法实例讲解
- C#的FileInfo类实现文件操作实例
- PHP简单选择排序算法实例
- C#实现排列组合算法完整实例
- PerlAnyEvent中的watcher实例