#383 Div1 Problem B Arpa's weak amphitheater.... (分组背包 && 并查集)
题意 : 有n个人,每个人都有颜值bi与体重wi。剧场的容量为W。有m条关系,xi与yi表示xi和yi是好朋友,在一个小组。 每个小组要么全部参加舞会,要么参加人数不能超过1人。 问保证总重量不超过W,剧场中的颜值最大能到多少?
分析 : 很显然的分组背包题目, 不过有所不同, 先来回顾一下普通的分组背包的描述 给出一个背包,背包有容量C,再给出N组物品,每组物品有ki种,每种物品有对应的体积Vi,价值Pi,每组物品至多选一种,且最多取一件。求用背包装物品,能获得的最大总价值是多少。可以发现和上面的不同之处就是多了一个可以全取的操作, 其实只要再在每一组里面加上所有的物品和就行了, 便成了一道普通的模板题了!在分组的时候使用简单的并查集即可!
瞎搞 : 在实现的时候很慢, 还老是犯小错误, 归其原因就是分组背包接触太少, 即使是模板题也写的有点不流利!
#include<bits/stdc++.h> using namespace std; struct st { int w, v, id; }; st arr[]; ][], w[][], dp[], p[];///p数组表示各个组里面的物品个数 ], sumw[]; ]; map<int, int> M; int findset(int x) { int root = x; while(c[root] != root) root = c[root]; int j; while(c[x] != root){ j = c[x]; c[x] = root; x = j; } return root; } inline int join(int a, int b) { int f = findset(a), ff = findset(b); if(f != ff){ c[f] = ff; } } #define IN 0 #define OUT 0 int main(void) { #if IN freopen("in.txt", "r", stdin); #endif #if OUT freopen("out.txt", "w", stdout); #endif int n, m, C; scanf("%d%d%d", &n, &m, &C); M.clear(); ; i<=n; i++){ memset(v[i], , sizeof(v[i])); memset(w[i], , sizeof(w[i])); memset(p, , sizeof(p)); memset(dp, , sizeof(dp)); memset(sumw, , sizeof(sumw)); memset(sumv, , sizeof(sumv)); arr[i].id = i;//忽略这个id, 没有用, 懒得改了..... c[i] = i; } ; i<=n; i++) scanf("%d", &arr[i].w); ; i<=n; i++) scanf("%d", &arr[i].v); ; i<m; i++){ int a, b; scanf("%d%d", &a, &b); join(a, b); } ;///表示组数 ]; memset(vis, true, sizeof(vis)); ; i<=n; i++){ int temp = findset(i); if(vis[temp]){///如果还没有出现过这个在并查集里面的“大佬” M[temp] = top;//记录一下老大所在的组的下标元素 vis[temp] = false; v[top][p[top]] = arr[i].v; w[top][p[top]] = arr[i].w; sumv[top] += arr[i].v; sumw[top] += arr[i].w; p[top]++, top++; }else{ int Top = M[temp]; v[Top][p[Top]] = arr[i].v; w[Top][p[Top]] = arr[i].w; sumv[Top] += arr[i].v; sumw[Top] += arr[i].w; p[Top]++; } } ; i<top; i++){ ) continue;//这里需要注意, 只有一个元素的时候, 不应该再加所有元素的和, 会重复的! v[i][p[i]] = sumv[i]; w[i][p[i]] = sumw[i]; p[i]++; } ///Debug begin // printf("top = %d\n", top); // for(int i=0; i<top; i++){ // printf("In group %d\n", i); // printf("v");puts(""); // for(int j=0; j<p[i]; j++){ // printf("ord=%d, v=%d\n", j, v[i][j]); // } // printf("w");puts(""); // for(int j=0; j<p[i]; j++){ // printf("ord=%d, w=%d\n", j, w[i][j]); // } // puts(""); // } // puts(""); ///Debug end ; i<top; i++){ ; j--){ ; k<p[i]; k++){ if(w[i][k] <= j) dp[j] = max(dp[j], dp[j-w[i][k]]+v[i][k]); } } ///Debug begin // for(int ii=1; ii<=C; ii++){ // printf("%d ", dp[ii]); // } // puts(""); ///Debug end } printf("%d\n", dp[C]); ; }
#383 Div1 Problem B Arpa's weak amphitheater.... (分组背包 && 并查集)的更多相关文章
- Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(分组背包+dsu)
D. Arpa's weak amphitheater and Mehrdad's valuable Hoses Problem Description: Mehrdad wants to invit ...
- Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses —— DP(01背包)
题目链接:http://codeforces.com/contest/742/problem/D D. Arpa's weak amphitheater and Mehrdad's valuable ...
- Codeforces Round #383 (Div. 2)D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(dp背包+并查集)
题目链接 :http://codeforces.com/contest/742/problem/D 题意:给你n个女人的信息重量w和美丽度b,再给你m个关系,要求邀请的女人总重量不超过w 而且如果邀请 ...
- Arpa's weak amphitheater and Mehrdad's valuable Hoses
Arpa's weak amphitheater and Mehrdad's valuable Hoses time limit per test 1 second memory limit per ...
- B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
B. Arpa's weak amphitheater and Mehrdad's valuable Hoses time limit per test 1 second memory limit p ...
- Codeforces 741B:Arpa's weak amphitheater and Mehrdad's valuable Hoses(01背包+并查集)
http://codeforces.com/contest/741/problem/B 题意:有 n 个人,每个人有一个花费 w[i] 和价值 b[i],给出 m 条边,代表第 i 和 j 个人是一个 ...
- Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses
[题目链接] http://codeforces.com/problemset/problem/741/B [题目大意] 给出一张图,所有连通块构成分组,每个点有价值和代价, 要么选择整个连通块,要么 ...
- D. Arpa's weak amphitheater and Mehrdad's valuable Hoses 分组背包模板题
http://codeforces.com/problemset/problem/742/D 并查集预处理出所有关系. 一开始的时候,我预处理所有关系后,然后选择全部的时候,另起了一个for,然后再判 ...
- 【42.86%】【codeforces 742D】Arpa's weak amphitheater and Mehrdad's valuable Hoses
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
随机推荐
- Linux执行命令./command与直接输入命令的区别
我们知道查看文件属性的命令ls的完整文件路径为:/bin/ls(这是绝对路径,)问什么我可以在任何地方执行,任何目录下输入ls就一定可以显示出一些信息而不会说找不到该/bin/ls命令,这是因为不同的 ...
- idea常用快捷键列表
在使用IntelliJ Idea的时候,使用快捷键是必不可少的.掌握一些常用的快捷键能大大提高我们的开发效率.有些快捷键可以熟练的使用,但是还有另外一些快捷键虽然很好用,但是由于因为没有形成使用习惯或 ...
- noip2015day2-运输计划
题目描述 公元$ 2044 $年,人类进入了宇宙纪元. \(L\) 国有 \(n\) 个星球,还有 \(n-1\) 条双向航道,每条航道建立在两个星球之间,这 \(n-1\) 条航道连通了 \(L\) ...
- 使用iwebshop開發實現QQ第三方登錄
$appid = "101353491"; $appkey = "df4e46ba7da52f787c6e3336d30526e4"; $redirect_ur ...
- 抖音很火的存钱计划,让python告诉你总共可以存到多少钱!
抖音上有个很火的存钱计划,说是第一天存1块钱,第二天存2块钱,第三天存3块钱.....依此类推存365天,总共可以存到多少钱,我们现在用python告诉你怎么做: #定个初始存入金额 money = ...
- chrome插件2
转自:http://www.codeceo.com/article/15-chrome-extension.html 1. Web Developer 支持Chrome的Web Developer扩展 ...
- PHP实现无限极分类的两种方式
无限极分类说简单点就是一个类可以分成一个分子类,然后一个子类又可以分另一个子类这样无限分下去,就是好象windows可以新建一个文件夹,然后在这个文件夹里又可以建一个文件夹,PHP要实现无限极分类有两 ...
- uni-app如何编写底部导航栏
在pages.json中配置代码如下: { "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocat ...
- 利用ab压力工具对服务器进行压力测试
假如我们需要对http://letv.com进行压力测试,指定请求总数为100,并发用户数为10,我们可以以下面的方式进行测试 $ ab -n 100 -c 10 http://letv.com/Th ...
- [转载]排序:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap
长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap 请设计并实现排序. google笔试小题.题目来源:http://wenku.baidu.com/view/5aa818dda5 ...