11/28每周学习报告10

P2240 【深基12.例1】部分背包问题

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
int begin;
int end;
}a[105];
bool cmp(node x,node y){
return double(x.end)/double(x.begin)>double(y.end)/double(y.begin);
}
int main()
{
    int n,t;
    cin>>n>>t;
    for(int i=0;i<n;i++){
    cin>>a[i].begin;
    cin>>a[i].end;
    }
    sort(a,a+n,cmp);
    int k=-1;
    double s=0;
    for(int i=0;i<n;i++){
        if(t<=a[i].begin){
        k=i;
        break;
        }
    t-=a[i].begin;
    s+=a[i].end;
    }
    if(k!=-1){
    s+=(double(t)/double(a[k].begin))*a[k].end;}
    printf("%.2lf",s);
}

题意:选择合适的金币装进背包要使价值最高
题解:记得刚学贪心时就做了这道题了,现在看到这道题格外亲切,自从被动态规划摧残后,感觉贪心问题是多么单纯(当然难的贪心题,还是不会做)。
不扯别的,这道题的思路只需要对价值除重量从大到小排序即可,典型的贪心排序的方法。这里也不加证明了,仔细想,会发现这题不是很难。
P1873 [COCI 2011/2012 #5] EKO / 砍树

#include <iostream>
#include<map>
using namespace std;
typedef long long ll;
using namespace std;
ll n,m,s=0,mid,left1,right1,a[1000005];
int main()
{
        cin>>n>>m;
    for(int i=1;i<=n;i++){
    cin>>a[i];
    right1=max(right1,a[i]);
    }
    while(left1<=right1)
    {
        mid=(left1+right1)/2;
        s=0;
        for(int i=1;i<=n;i++)
			if(a[i]>mid)
				s+=a[i]-mid;
        if(s<m)
			right1=mid-1;
		else
			left1=mid+1;
    }
    cout<<left1-1;
    return 0;
}

题意:获得对应木材,砍伐后的木材高度最高。
题解:典型的二分题,本题的二分是每次循环算出砍完后获得的木材,然后二分比较,和常规的二分稍微有点不同,不过也不算很难。
总结:本周也是咸鱼的一周啊。。。。。。。。回头看了一些以往的acm课上的ppt发现有些还是不太会!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值