1. 程式人生 > >jzojs 100044. 【NOIP2017提高A組模擬7.13】abcd

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=10025

20=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分了!!!
好啦,爆蛋啦,只好草草地打了個暴力。。。
時間啊!!!!這™時間分配是多麼重要啊!!!
下次一定一定要好好注意!!!!!!!!!!!