算法读资料总结—贪心(10)

目录

总结

【PAT B1020】月饼

【PAT B1023】组个最小数 

  序列问题(链接)

【PA2015】【Kieszonkowe】(链接)


总结

这周看的贪心,确实在难度上比最短路提升了很多,需要大量的看题目来提升自身的对题目意识。这周的时间算是比较紧张的,因为有门考试,看了30篇博客,不算多,但也算有所收获。证明的一般思路是使用反证法以及数学归纳法,即假设策略不能导致最优解,然后通过一系列推导来得到矛盾,以此证明策略是最优的,最后用数学归纳法保证全局最优。

【PAT B1020】月饼

题意:

现有所有种类月饼的库存量、总售价以及市场的最大需求量,试计算可以获得的最大收益是多少。

sort (cake,cake+n,cmp);//按单价从高到低排序
double ans=0;//收益
for(int i=0;i<n;i++){
if (cake[i].store<=D){
D-=cake[i].store;//第i种月饼全部卖出
ans+=cake[i].sell;
}
else { //如果月饼库存量高于需求量
ans+=cake[i].price*D;//只卖出剩余需求量的月饼
break;
   }
}

【PAT B1023】组个最小数 

题意:

给出0~9数若干,每个数都必须用上,求得所组成的最小数

策略:

先从1~9中选择个数不为0的最小数输出,然后从0~9输出数字,每个数字输出次数为其剩余个数。

for(int i=1;i<10;i++){//从1~9中选择count不为零的最小数字
if(count[i]>0){
cout<<i<<endl;
count[i]--;
break;//找到一个后就中断
}
for(int i=0;i<10;i++)//从0~9输出对应个数的数字

序列问题(链接

 题意:

对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列。


  scanf("%d",&n);
  for (int i=1;i<=n;i++) scanf("%d",&a[i]);
  for (int i=1;i<=n-1;i++) ans+=max(a[i],a[i+1]);

【PA2015】【Kieszonkowe】(链接)

题意:

给定n个数,请从中选出若干个数,使得总和为偶数,请最大化这个总和。


     if (x%2==0) ans+=x;
     else {temp+=x;a[++cnt]=x;} 
  }
  if (cnt%2==1){
     for (int i=1;i<=cnt;i++) minn=min(minn,a[i]);
     temp-=minn;

                                                                                                                                          【CQOI2007】【三角形tri】  (链接)       

题意:

画一个等边三角形,把三边的中点连接起来,得到四个三角形,把它们称为T1,T2,T3,T4。给出Spierpinski三角形中的一个三角形,找出它靠着的所有三角形。 


        ans[++ans[0]]=len-1;
        for (int i=len-2;i>=0;--i){
            f[ch[i+2]-'0']=true;
            if (ch[i+1]!=ch[i+2]&&!f[ch[i+1]-'0']) ans[++ans[0]]=i;
        }
        for (int i=1;i<=ans[0];++i){
            printf("T");for (int j=1;j<=ans[i];++j) printf("%c",ch[j]);

                                                                                                                                                                                                                                                                       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值