贪心笔记

来源:互联网 发布:中国贸易顺差历年数据 编辑:程序博客网 时间:2024/04/29 16:45
贪心笔记+题目思路:
(题目oj里有)
1:智力大冲浪:
读入,结构体
按价格从大到小排序(要保证赢取更多的钱)
要判断游戏是否完成,用bool数组存储
开始枚举一个游戏
枚举每一个游戏,看他之前(最近的)时间的有没有被占据
如果布尔数组没有被标记,则标记布尔数组,并且加上应取得钱

如果前面的数组都被标记,那么说明完成不了,减去钱的数目

代码为:

#include<bits/stdc++.h>
using namespace std;
struct k
{
int money,time;
}a[10000];
bool cmp(k z,k y)
{
return (z.money>y.money);
}
int main()
{
int have,n;
int b[10000]={};
cin>>have>>n;
for(int i=1;i<=n;i++)cin>>a[i].time;
for(int i=1;i<=n;i++)cin>>a[i].money;
sort(a+1,a+1+n,cmp);
for (int i=1;i<=n;i++) 
{
int k=a[i].time;
while(k>=1&&b[k]==1) k--;
if (k!=0)b[k]=1;
if (k==0) have-=a[i].money;
}
cout<<have;
return 0;
}


2.工程安排

数据量较大,用数据结构完成-----以后再讲。。。大哭


3.修理牛棚
输入样例(牛棚)
然后将样例进行排序
算出牛棚之间的间隙
将算出的间隙进行排序
然后将总长度减去钱m-1的间隙数目
(假设将左右都覆盖,减去m-1间隙即可)
即得到最后的结果
游荡的奶牛:
相当于(线段覆盖)+(穿墙人)
按右端点从小到大排序(相当于对后面线段的影响)
判断语句是:
for (int i=2;i<=n;i++)//从2开始表示第一条已经保留了,判断第2到n的点是否保留
{
  if (line[i].left>=line[now].right)//判断第i条线段是否能覆盖进去,也就是第i条线段的左边是否被第now条线段(的右边)所覆盖,如果条件成立说明第i条覆盖
  {
    ans++;
    now=i;
  }

}//now表示最后被覆盖的点,初始值为1;line数组为结构体,储存的是第i条线段左边的(.left)的数值和右边的(.right)的数值,ans表示最后的结果


4.穿墙人
题目的其他条件和先前的奶牛一样
---每个点最多被覆盖k次(k很小)
比原来程序多:
  看这条线段能不能被放(在定义一个数组统计覆盖次数)

  相当于多一个if语句或者多一个判断条件


5.农场分配和第二题一样数据量太大。。。

算法还是和第四题一样的。。委屈