Hdu 6804 Contest of Rope Pulling —— 随机化,背包周期

2024-04-06 23:32

本文主要是介绍Hdu 6804 Contest of Rope Pulling —— 随机化,背包周期,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

This way

题意:

现在有两个集合的人,每个人都有一个重量和一个价值,你要在每个集合中选择一些人使得两个集合的人的重量之和相同,并且总价值最大。

题解:

题解的想法我在赛场上也想到了,但是我是按照重量排序的,然后就被卡掉,过不去。
但是将所有人放在一起随机化一下的话,我们知道背包就是选择一些数使得他们的重量达到预定的大小的同时让价值之和最大。这道题目就是一个正向背包加一个反向背包使得他们在重量之和为0的情况下价值最大。
那么不妨设第二个集合的人的重量为负的,然后加到第一个集合当中,那么我们现在所要做的就是选择一些人使得重量之和为0,价值之和最大。然后随机化的话,就可以将正负更加离散的排列,更正确的说,是将正的我们要取的人和负的我们要取的人更离散的排列,这样我们在做背包的时候,可以将重量大概率地控制在一个范围内:
在这里插入图片描述
假设0点在这,那么随机以后,它的背包可能就会是这样的。当然,其中会多出很多无用的点,但是背包会记录所有情况,我们不需要知道到底是哪些有用的,哪些没用的。
mt19937可以随机一个在-MAXINT~MAXINT之间的值

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1005,ad=N*40;
ll dp[N*105];
mt19937 rnd(time(NULL));
struct node{int w;ll v;
}a[N*2];
int main()
{int t;scanf("%d",&t);while(t--){memset(dp,-1,sizeof(dp));int n,m;scanf("%d%d",&n,&m);n+=m;for(int i=1;i<=n;i++)scanf("%d%lld",&a[i].w,&a[i].v),a[i].w*=i>n-m?-1:1;shuffle(a+1,a+1+n,rnd);int l=ad,r=ad,liml=0,limr=ad*2;//ll ans=0;dp[ad]=0;for(int i=1;i<=n;i++){if(a[i].w>0){for(int j=r;j>=l;j--)if(~dp[j])dp[j+a[i].w]=max(dp[j+a[i].w],dp[j]+a[i].v);r=min(limr,r+a[i].w);}else{for(int j=max(-a[i].w,l);j<=r;j++)if(~dp[j])dp[j+a[i].w]=max(dp[j+a[i].w],dp[j]+a[i].v);l=max(liml,l+a[i].w);}}printf("%lld\n",dp[ad]);}return 0;
}

这篇关于Hdu 6804 Contest of Rope Pulling —— 随机化,背包周期的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881117

相关文章

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

Codeforces April Fools Day Contest 2014(附官方题解)

Codeforces2014年愚人节的坑题。。。但还是感觉挺好玩的。。。 A. The Great Game time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Two teams mee

Codeforces April Fools Day Contest 2013

2013年愚人节的坑题。。。 A. Mysterious strings time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Input The input contains a sin

采药问题 01背包

Description:辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

Atcoder Beginner Contest 359

传送门 A - Count Takahashi 时间限制:2秒        内存限制:1024MB 分数:100分 问题描述 给定 N 个字符串。 第 i 个字符串  () 要么是 Takahashi 要么是 Aoki。 有多少个 i 使得  等于 Takahashi ? 限制 N 是整数。每个字符串  是 Takahashi 或者 Aoki。() 输入格式

如何用动态规划解决0-1背包问题(C语言实现)

对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制前提下,背包中物品总重量的最大值是多少?假设此时是5个物品,2,2,4,6,3,然后背包最大承载两是9. 假如我们使用回溯算法解决该问题, 代码如下 int maxW = 0; //最大重量int n = 5; //物品数目int w = 9; // 背包最大重量int weight[] = {2,2,4,

AtCoder Beginner Contest 359 A~C(D~F更新中...)

A.Count Takahashi 题意 给出 N N N个字符串,每个字符串为以下两种字符串之一: "Takahashi" "Aoki" 请你统计"Takahashi"出现了多少次。 分析 输入并统计即可。 代码 #include <bits/stdc++.h>using namespace std;typedef long long ll;void solve() {i

从网易校招编程题谈起,轻松理解有趣的0-1背包问题

从网易的一道算法题开始 最近在准备春招实习,偶然做到网易的一道编程题,一方面找了很多博客看的云里雾里,这里特别写下解题的思路和逻辑,一方面加深印象,另一方面供需要的你学习参考。好了,话不多说,开始吧。本文提供思路,并给出Java代码实现例子,供大家参考。 先睹为快 来源:网易2017春招笔试真题编程题 时间限制:1秒 空间限制:32768K 一种双核CPU的两个核能够同时的处理任务,现在有