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; }