贪心算法学习总结
对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。加工木棒,第一根加工的木棒耗费一分钟,接下来的每根木棒长度和重量大于或者等于第一根木棒则不费时间,否则需要花费一分钟。找到花费时间最少的最优解,首先将木棒长度按升序排列,若有相等情况则按木棒重量升序排列,安装前将数组赋初值为0,每安装一根初值变为1,若前一根木棍重量大于后一个根木棍,则时间加1。
#include<stdio.h>
#include
using namespace std;
struct node{定义结构体,方便查找
int weight;重量
int length;长度
int valid;是否安装
}a[5001];
bool cmp(node a,node b) 将数组长度升序排列,若相等则按照重量升序排列
{
if(a.length==b.length) return a.weight<b.weight;
else return a.length<b.length;
}
另外加循环for(j=i+1;j<n;j++)//判断前一根木棍重量和长度是否小于或等于后一根木棍重量和长度 ,然后输出n即可。
G题大概说有四百个房间在走廊的两边,从房间s把桌子挪到房间 t,同一段走廊只能放下一张桌子,一张桌子从一个房间移动到另一个房间需要10分钟,不是同一段走廊的话可以同时移动,求移动所有桌子所需要的最短时间。走廊两边的房间看成一个整体(1 , 2)为走廊1,(3 ,4)为走廊2…走廊k每使用一次标记一下,最后求最大标记数10就是所需要的最短时间
for(i=1;i<=n;i++)
{
cin<<a;
cin<<b;
if(a>b)
{
h=a;a=b;b=h;
}
a1=(a+1)/2;
b1=(b+1)/2;
for(j=a1;j<=b1;j++)
{
book[j]++;
}
}
max=0;
for(i=1;i<=220;i++)
{
if(book[i]>max)
max=book[i];
}
cout>>max10;
}
return 0;
}
刚开始会想成区间调度问题,如果重叠就++,虽然过了样例,但是不出意料的错了了。
换一下思路,想要花时间少,就要少共享走廊,共享次数最多的走廊花费的时间最长,而这恰好等于所用的时间。因此,只需求出走廊的最大共享次数,即重叠次数最多是多少。while(t–){
cin>>n;
for(int i=0;i<n;i++)
{ cin>>s>>e; if(s>e)swap(s,e);
一定要判断一下起点终点大小,另外关于结构体我还想说一下结构体数组的有关理解
结构体数组的每一个元素都是结构体。在实际应用中,经常用结构体数组来表示一个拥有相同数据结构的群体,比如一个班的学生,一个车间的职工等。定义结构体数组和定义结构体变量的方式类似。但还是有些区别的。贪心也就是熟练运营这种工具来寻求最优解。
2021-03-27
最新推荐文章于 2021-12-17 10:53:56 发布