【NOIP2014 Day1 T3】飞扬的小鸟

时间:2022-12-16 15:45:38

【NOIP2014 Day1 T3】飞扬的小鸟

Time Limit:20000MS  Memory Limit:131072K
Total Submit:58 Accepted:14 
Case Time Limit:1000MS

Description

【NOIP2014 Day1 T3】飞扬的小鸟 

Input

【NOIP2014 Day1 T3】飞扬的小鸟 

Output

【NOIP2014 Day1 T3】飞扬的小鸟 

Sample Input

样例输入1:
10 10 6
3 9
9 9
1 2
1 3
1 2
1 1
2 1
2 1
1 6
2 2
1 2 7
5 1 5
6 3 5
7 5 8
8 7 9
9 1 3

样例输入2:
10 10 4
1 2
3 1
2 2
1 8
1 8
3 2
2 1
2 1
2 2
1 2
1 0 2
6 7 9
9 1 4
3 8 10

Sample Output

样例输出1:
1
6

样例输出2:
0
3

Hint

【NOIP2014 Day1 T3】飞扬的小鸟 

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 10005
#define maxm 1005
#define inf 1<<25
using namespace std;
int f[maxn][maxm],up[maxn],down[maxn],top[maxn],tail[maxn];
int n,m,tt,ans=0;
int main()
{
	int i,j,k,t,Min=inf;
	bool mark;
	scanf("%d%d%d",&n,&m,&tt);
	for(i=1;i<=n;i++)
	{
		scanf("%d%d",&up[i],&down[i]);
		top[i]=m+1;
		for(j=0;j<=m;j++)f[i][j]=inf;
	}
	for(i=1;i<=tt;i++)
	{
		scanf("%d",&t);
		scanf("%d%d",&tail[t],&top[t]);
	}
	for(i=1;i<=n;i++)
	{
		mark=0;
		for(j=0;j<=m;j++)
			if(j-up[i]>0)
				f[i][j]=min(f[i][j-up[i]]+1,min(f[i][j],f[i-1][j-up[i]]+1));
			
		for(j=max(0,m-up[i]);j<=m;j++)
			f[i][m]=min(f[i][j]+1,min(f[i][m],f[i-1][j]+1));
				
		for(j=0;j<=m;j++)
			if(j+down[i]<=m)f[i][j]=min(f[i][j],f[i-1][j+down[i]]);
			
//		for(j=1;j<=m;j++)printf("%d ",f[i][j]);
//		putchar(10);
		for(j=0;j<=tail[i];j++)f[i][j]=inf;
		for(j=top[i];j<=m;j++)f[i][j]=inf;
		
//		for(j=1;j<=m;j++)printf("%d ",f[i][j]);
//		putchar(10);
		
		for(j=tail[i]+1;j<top[i];j++)
			if(f[i][j]<inf){mark=1;break;}
		if(!mark){printf("0\n%d\n",ans);return 0;}
		if(top[i]!=m+1||tail[i]!=0)ans++;
//		printf("%d--%d\n",i,ans);
	}
	for(j=tail[n]+1;j<top[n];j++)Min=min(f[n][j],Min);
	printf("1\n%d\n",Min);
	return 0;
}

————dp————

dp[i][j]=min(dp[i][j],dp[i-1][j-up[i]]+1);

1.dp[i][j]=min(dp[i][j],k*dp[i-1][j-up[i]]+1);//过不完所有数据,会超时;

2.dp[i][j]=min(dp[i][j],dp[i][j-up[i]]+1);//太机智了,完全背包(以后注意都这样写,也算一个优化);