码迷,mamicode.com
首页 > 其他好文 > 详细

第七周 10.12---10.18

时间:2015-10-12 14:33:42      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:

新的一周--- >_<

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 }
View Code


记得雨神暑假挂过一场比赛的一道题,也是类似这样排下序---

去找下先----

 

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 }
View Code

 

第七周 10.12---10.18

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4871448.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!