标签:
新的一周--- >_<
gooooooooo----
---------10.12
hdu 5501
补了周六BC的背包
背包很好想到,一道题目做不做,相当于是01背包,给出t,没有说要不要装满,所以最后扫一遍所有的dp值就可以了
然后就是题目的排序---看的题解了----题解讲得很清楚
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 8 const int maxn = 1005; 9 int a[maxn],b[maxn],c[maxn]; 10 int n,m; 11 int dp[5*maxn]; 12 13 struct node{ 14 int x,y,z; 15 double q; 16 }p[maxn]; 17 18 int cmp(node n1,node n2){ 19 return n1.q > n2.q; 20 } 21 22 void solve(){ 23 sort(p+1,p+n+1,cmp); 24 for(int i = 1;i <= n;i++){ 25 a[i] = p[i].x; 26 b[i] = p[i].y; 27 c[i] = p[i].z; 28 } 29 30 memset(dp,0,sizeof(dp)); 31 int res = -1; 32 for(int i = 1;i <= n;i++){ 33 for(int j = m;j >= c[i];j--){ 34 dp[j] = max(dp[j],dp[j-c[i]] + a[i]-j*b[i]); 35 res = max(res,dp[j]); 36 //printf("dp[%d] = %d\n",j,dp[j]); 37 } 38 } 39 printf("%d\n",res); 40 } 41 42 int main(){ 43 int T; 44 scanf("%d",&T); 45 while(T--){ 46 scanf("%d %d",&n,&m); 47 for(int i = 1;i <= n;i++){ 48 scanf("%d %d %d",&p[i].x,&p[i].y,&p[i].z); 49 p[i].q = 1.0*p[i].y/p[i].z; 50 } 51 52 solve(); 53 54 } 55 return 0; 56 }
记得雨神暑假挂过一场比赛的一道题,也是类似这样排下序---
去找下先----
ZOJ 3908
从大到小枚举 x
将找到的小于等于 k-x的存起来,然后排序取前 m 大---
不会用STL,改得想哭了---
程序一直崩,一个lower_bound找到 s.end(),还不懂迭代器要减减一下---
最后还偷瞄了别人的代码------sad------
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<vector> 6 #include<set> 7 using namespace std; 8 9 typedef long long LL; 10 const int maxn = 1e6+5; 11 int n,m,k; 12 int a[maxn]; 13 14 struct node{ 15 int x,y; 16 }p[maxn]; 17 18 int cmp(node n1,node n2){ 19 return n1.x*n1.y > n2.x*n2.y; 20 } 21 22 void solve(){ 23 multiset<int> s; 24 multiset<int>::iterator it; 25 multiset<int>::iterator itt; 26 27 for(int i = 1;i <= n;i++) if(a[i] <= k) s.insert(a[i]); 28 int l,r; 29 int cnt = 0; 30 31 for(;;){ 32 if(s.size() < 2) break; 33 34 it = s.end();it--; 35 s.erase(it); 36 int x = *it; 37 int y = k-x; 38 39 itt = s.lower_bound(y); 40 if(itt == s.end()) itt--; 41 if(itt == s.begin() && *itt > y) continue; 42 43 if(*itt > y) { 44 if(itt == s.begin()) continue; 45 else itt--; 46 } 47 48 p[++cnt].x = *it;p[cnt].y = *itt; 49 50 s.erase(itt); 51 } 52 53 sort(p+1,p+cnt+1,cmp); 54 55 //for(int i = 1;i <= cnt;i++) printf("p[%d].x = %d p[%d].y = %d\n",i,p[i].x,i,p[i].y); 56 57 LL res = 0; 58 for(int i = 1;i <= min(m,cnt);i++) res += 1LL*p[i].x*p[i].y; 59 printf("%lld\n",res); 60 } 61 62 int main(){ 63 int T; 64 scanf("%d",&T); 65 while(T--){ 66 scanf("%d %d %d",&n,&m,&k); 67 for(int i = 1;i <= n;i++) scanf("%d",&a[i]); 68 69 solve(); 70 71 } 72 return 0; 73 }
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4871448.html