The 9-th BIT Campus Programming F. 狂乱(背包)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The 9-th BIT Campus Programming F. 狂乱(背包)相关的知识,希望对你有一定的参考价值。

LINK

首先枚举每一个随从 p p p作为被控制的随从,这部分复杂度为 O ( 100 ) O(100) O(100)

然后用 p p p打死其他随从需要的血量是固定的,获得的价值就是其他随从的攻击力

看起来可以做个背包,但是当 p p p快死亡时的最后一击,即使之还剩 1 1 1滴血也可以发起最后一击

显然需要枚举最后一次攻击打死哪个随从,这部分复杂度为 O ( 100 ) O(100) O(100)

再套一个背包复杂度就太高了,但是我们可以提前预处理

处理 f 1 [ i ] [ j ] f1[i][j] f1[i][j]表示在 [ 1 , i ] [1,i] [1,i]个随从花费血量 j j j干掉的最大攻击力
处理 f 2 [ i ] [ j ] f2[i][j] f2[i][j]表示在 [ i , n ] [i,n] [i,n]个随从花费血量 j j j干掉的最大攻击力

那么当 p p p作为被控制随从, i i i作为 p p p最后一个攻击的随从时

我们枚举 [ 1 , i − 1 ] [1,i-1] [1,i1]花费血量 j j j能得到的最大收益,最后一次打死随从 i i i花费血量 h u a hua hua

那么此时的最大收益就是 f 1 [ i − 1 ] [ j ] + f 2 [ i + 1 ] [ y i d − j − h u a ] + x i + x i d f1[i-1][j]+f2[i+1][y_{id}-j-hua]+x_i+x_{id} f1[i1][j]+f2[i+1][yidjhua]+xi+xid

需要注意的是,可能会存在 p p p把所有其他随从全都打死自己还活着的情况,此时就不应该计算 x i d x_{id} xid的贡献

#include <bits/stdc++.h>
using namespace std;
int x[109],y[109],f1[109][10009],f2[109][10009];
int n,ans,sum;
void initDP(int id)
{
	/*
	f1[i][j]表示前i个随从花费血量j干掉的最大攻击力
	f2[i][j]表示[i,n]花费j血量干掉的最大攻击力 
	*/
	for(int i=1;i<=n;i++)
	for(int j=0;j<=10000;j++)
		f1[i][j] = f2[i][j] = 0;
	for(int i=1;i<=n;i++)
	for(int j=0;j<=10000;j++)
	{
		f1[i][j] = f1[i-1][j];
		if( i==id )	continue;
		int val = x[i]*( (y[i]-1)/x[id]+1 );
		if( j>=val )	f1[i][j] = max( f1[i][j],f1[i-1][j-val]+x[i] );
	}
	
	for(int i=n;i>=1;i--)
	for(int j=0;j<=10000;j++)
	{
		f2[i][j] = f2[i+1][j];
		if( i==id )	continue;
		int val = x[i]*( (y[i]-1)/x[id]+1 );
		if( j>=val )	f2[i][j] = max( f2[i][j],f2[i+1][j-val]+x[i] );
	}
}
void solve(int id)//id作为攻击者 
{
	initDP( id );
	int pre = 0;
	for(int i=1;i<=n;i++)	pre += x[i]*( (y[i]-1)/x[id]+1 );
	pre -= x[id]*( (y[id]-1)/x[id]+1 );
	for(int i=1;i<=n;i++)//最后一次撞的是i 
	{
		if( i==id )	continue;
		int hua = x[i]*( (y[i]-1)/x[id] )+1;//干掉i最少需要的血量
		int now = pre-x[i]*( (y[i]-1)/x[id]+1 )+hua; 
		for(int j=0;j<=y[id]-hua;j++)//枚举前i-1个花费j血量得到的最大收益 
		{
			if( now<y[id] )
				ans = min( ans, sum-f1[i-1][j]-f2[i+1][y[id]-j-hua]-x[i] );
			else
				ans = min( ans, sum-f1[i-1][j]-f2[i+1][y[id]-j-hua]-x[i]-x[id] );
				//如果要让第id个随从直接死掉,同样枚举前i-1个花费血量j, 
		}
	}
}
int main()
{
	cin >> n;
	for(int i=1;i<=n;i++)	cin >> x[i] >> y[i], sum += x[i];
	if( n==1 ){ cout << 0; return 0; }
	ans = 1e18;
	for(int i=1;i<=n;i++)	solve( i );//枚举点i作为攻击者 
	cout << ans;
}

以上是关于The 9-th BIT Campus Programming F. 狂乱(背包)的主要内容,如果未能解决你的问题,请参考以下文章

svn: how to set the executable bit on a file?

This problem will occur when running in 64 bit mode with the 32 bit Oracle client components install

Implement the integral part logn base 2 with bit manipulations

The adidas NMD XR1 singapore is a bit more cool

the virtual machine is configured for 64-bit guest operating systems

Does the 64-bit processor always perform better than 32-bits?