jzojs 100044. 【NOIP2017提高A组模拟7.13】abcd

哈哈,看这题挺少题解的,就发一份吧

Description
在这里插入图片描述

Input
输入文件名为abcd.in
输入文件共 N+1 行。
第 1 行包含1个正整数N。
第 i+1 行包含4个整数a[i],b[i],c[i],d[i]。

Output
输出文件名为abcd.out。
输出共1行,包含1个整数,表示所给出公式的最大值。
输入数据保证一定有解。

Sample Input
Sample1:
5
-1 1 2 5
-2 2 1 2
0 1 1 3
-2 -1 3 10
-2 2 3 9
Sample2:
10
1 10 1 7
-10 10 2 0
-10 10 2 2
-10 10 2 0
1 10 1 0
-10 10 2 0
10 10 2 0
1 10 1 0
-10 10 2 0
1 10 1 0
Sample3:
10
1 10 1 0
-10 10 2 2
-10 10 2 2
-10 10 2 2
1 10 1 0
-10 10 2 2
-10 10 2 2
1 10 1 0
-10 10 2 2
1 10 1 0

Sample Output
Sample1:
2
Sample2:
90
Sample3:
-4

Data Constraint
对于20%的数据,N≤10,-2≤a[i]<b[i]≤2;
对于60%的数据,N≤50, -20≤a[i]<b[i]≤20;
对于100%的数据,
N≤200,-25≤a[i]<b[i]≤25,1≤c[i]≤20,0≤p[i] ≤100000。

时间有保障!!!
在这里插入图片描述
很容易想到设f[i][j]表示到了第i个点和为j(c数组)的最大值。
然后一波DP。。。
每次暴力枚举e[i],然后进行更新即可,时间的话。。。
我们可以发现之中,a[i],b[i]的值很小,由于最后还要归回0,所以我们不难发现,j的最大值和最小值是可以知道的!!!n/2时,max=1002520=50000,min=100*-25=-50000。
第i位的最大最小值为:if(i<n/2) mx[i]=2520i,mi[i]=-2520i;
else mx[i]=2520(n-i),mi[i]=-2520(n-i);
总而言之,可以过的。

咳咳,差点忘了贴标了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[201],b[201],c[201],d[201],f[201][7010];

inline int read()
{
	int x=0,f=0; char c=getchar();
	while (c<'0' || c>'9') f=(c=='-') ? 1:f,c=getchar();
	while (c>='0' && c<='9') x=x*10+c-48,c=getchar();
	return f ? -x:x;
}

int main()
{
	n=read();
	memset(f,128,sizeof(f));
	for (int i=1;i<=n;i++)
		a[i]=read(),b[i]=read(),c[i]=read(),d[i]=read();
	f[0][3500]=0;
	for (int i=1;i<=n;i++)
		for (int j=a[i];j<=b[i];j++)
			for (int k=0;k<=7000;k++)
				if (k+j*c[i]>=0 && k+j*c[i]<=7000) f[i][k]=max(f[i][k],f[i-1][k+j*c[i]]+j*d[i]);
	printf("%d\n",f[n][3500]);
	return 0;
}

In general,时间分配得一点都不合理。
第一题打完后打对拍又花了半个小时,
再之后就想第二题,第二题预处理打了记忆化dfs(竟然没有想到bfs!!!)结果样例时超了!!!
没办法,开始不断地想,想啊想,想啊想,想到最后™11:30分了!!!
好啦,爆蛋啦,只好草草地打了个暴力。。。
时间啊!!!!这™时间分配是多么重要啊!!!
下次一定一定要好好注意!!!!!!!!!!!

posted @ 2018-12-15 16:16  jz929  阅读(105)  评论(0编辑  收藏  举报