The 9-th BIT Campus Programming F. 狂乱(背包)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The 9-th BIT Campus Programming F. 狂乱(背包)相关的知识,希望对你有一定的参考价值。
首先枚举每一个随从 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,i−1]花费血量 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[i−1][j]+f2[i+1][yid−j−hua]+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?