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发现有些还是不太会!!!