百度之星2012初赛Day2 B - 度度熊的礼物
原创
©著作权归作者所有:来自51CTO博客作者zzyzzy12的原创作品,请联系作者获取转载授权,否则将追究法律责任
Day2反正我是没有170分~~实在感觉Day2的比Day1的难些~~可能很多人在Day2想抓住最后的稻草疯狂作弊吧~~囧~~Day2做了B,D题~~骗了A题~~但结果没有Day1的好噜~~D题我是暴力将10s切割成了1000份~~在每个瞬间中用O(n^3)的方法看最多有多少个点共线~~可是似乎还是有问题~~囧~~但B题是绝对没问题了~~
B题~~题目有给出K1<=n,K2<=n,K1+K2>=n这样的条件~~所以可得出在分配礼物的过程中~K1的变化范围为[n-K1,K1]..从物品1依次做到物品n..将当前所剩的K1看成背包的空间~~做01背包..得到答案~~
Program:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<queue>
#define oo 2000000000
#define ll long long
using namespace std;
struct node1
{
int x,y,d0,d1;
}p[1003];
struct node2
{
int x,y,k;
}gift[3];
int n,dp[2100],k0,k1,k;
int main()
{
int i,j,ans;
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);
for (i=0;i<=1;i++) scanf("%d%d%d",&gift[i].k,&gift[i].x,&gift[i].y);
for (i=1;i<=n;i++)
{
p[i].d0=gift[0].x*p[i].x+gift[0].y*p[i].y;
p[i].d1=gift[1].x*p[i].x+gift[1].y*p[i].y;
}
k0=gift[0].k; k1=gift[1].k;
memset(dp,0,sizeof(dp));
for (i=1;i<=n;i++)
for (j=k0;j>=n-k0;j--)
{
dp[j]=dp[j]+p[i].d1;
if (j && dp[j]<dp[j-1]+p[i].d0)
dp[j]=dp[j-1]+p[i].d0;
}
ans=0;
for (i=0;i<=k0;i++)
if (dp[i]>ans) ans=dp[i];
printf("%d\n",ans);
return 0;
}