首页 > 其他分享 >P1941 [NOIP2014 提高组] 飞扬的小鸟

P1941 [NOIP2014 提高组] 飞扬的小鸟

时间:2023-09-28 19:46:02浏览次数:48  
标签:pre NOIP2014 const cur int 飞扬 P1941 INF dp

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 10005;
const int M = 1005;
const int INF = 1e9;
int up[N], down[N], low[N], high[N], dp[2][M];
bool pipe[N];
int main() {
	int n, m, k;
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 1; i <= n; i++) {
		scanf("%d%d", &up[i], &down[i]);
		low[i] = 0;
		high[i] = m + 1;
	}
	for (int i = 1; i <= k; i++) {
		int h, l, p;
		scanf("%d%d%d", &h, &l, &p);
		low[h] = l; high[h] = p; pipe[h] = true;
	}
	int cnt = 0;
	bool ok = true;
	for (int i = 1; i <= n; i++) {
		// init
		int cur = i % 2, pre = 1 - cur;
		for (int j = 0; j <= m; j++) dp[cur][j] = INF;
        // up: +up
		for (int j = 0; j <= m; j++) { // 管道位置要先当成可达状态
			int from = j - up[i];
			if (from > 0 && dp[pre][from] != INF) dp[cur][j] = min(dp[cur][j], dp[pre][from] + 1);
			if (from > 0 && dp[cur][from] != INF) dp[cur][j] = min(dp[cur][j], dp[cur][from] + 1);
        }
		// top
		if (high[i] == m + 1) {
			for (int j = m - up[i]; j <= m; j++) {
                if (dp[pre][j] != INF) dp[cur][m] = min(dp[cur][m], dp[pre][j] + 1);
                if (dp[cur][j] != INF) dp[cur][m] = min(dp[cur][m], dp[cur][j] + 1);
            }
		}
		// down: -down
        // 下降的0/1背包在上升的完全背包之后计算
		for (int j = high[i] - 1; j >= low[i] + 1; j--) {
			int from = j + down[i];
			if (from <= m && dp[pre][from] != INF) dp[cur][j] = min(dp[cur][j], dp[pre][from]);
        }
		// check
		bool flag = false;
		for (int j = low[i] + 1; j <= high[i] - 1; j++) {
			if (dp[cur][j] != INF) {
				flag = true;
				break;
			}
		}
		if (!flag) {
			ok = false;
			printf("0\n%d\n", cnt);
			break;
		}
		if (pipe[i]) cnt++;
        for (int j = 0; j <= low[i]; j++) dp[cur][j] = INF;
        for (int j = high[i]; j <= m; j++) dp[cur][j] = INF;
	}
	if (ok) {
		printf("1\n");
		int ans = INF;
		for (int i = low[n] + 1; i <= high[n] - 1; i++) ans = min(ans, dp[n % 2][i]);
		printf("%d\n", ans);
	}
	return 0;
}

标签:pre,NOIP2014,const,cur,int,飞扬,P1941,INF,dp
From: https://www.cnblogs.com/ronchen/p/17736392.html

相关文章

  • 【题解】Luogu[P2296] [NOIP2014 提高组] 寻找道路
    Link很简单的一道图论题。要在一个有向图上找一条\(s\)到\(t\)的最短路,要求这条路径上的所有点都满足:该点的所有出边所连点都能到达终点\(t\)。看上去很乱,我们简单分解一下,先在所有点中找到与终点有路径的点集\(A\)进行标记,再再所有点中找到其所有出边所连点都被打上标......
  • NOIP2014 D2T1 奶酪
    NOIP2014奶酪题面:NOIP2014提高组D2T1现有一块大奶酪,它的高度为\(h\),它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为\(z=0\),奶酪的上表面为\(z=h\)。现在,奶酪的下表面有一只小......
  • 算法刷题记录:P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
    题目链接https://www.luogu.com.cn/problem/P1328题目分析是一道和环有关的问题,直接模拟即可AC代码//Problem:P1328[NOIP2014提高组]生活大爆炸版石头剪刀布//Contest:Luogu//URL:https://www.luogu.com.cn/problem/P1328//MemoryLimit:125MB//TimeLimit......
  • NOIP2014普及组试题题解
    1.珠心算测验代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=2e4+39+7;intmp[N],n,a[N],ans=0;intmain(){ cin>>n; for(inti=1;i<=n;i++)cin>>a[i]; for(inti=1;i<=n;i++){ for(intj=1;j<=n;j++)......
  • [NOIP2014 普及组] 珠心算测验
    [NOIP2014普及组]珠心算测验题目描述珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数......
  • P1941 [NOIP2014 提高组] 飞扬的小鸟 题解
    WC-2023上的题目。线性动态规划P1941[NOIP2014提高组]飞扬的小鸟我们先不管障碍物。设\(f[i][j]\)表示来到点\((i,j)\)的最少点击屏幕数。因为每秒要不上升\(......
  • 洛谷P2296 [NOIP2014 提高组] 寻找道路 题解
    题目链接:P2296[NOIP2014提高组]寻找道路-洛谷|计算机科学教育新生态(luogu.com.cn)好了,话不多说上代码:1#include<bits/stdc++.h>2usingnamespacestd;3......
  • 洛谷P2141 [NOIP2014 普及组] 珠心算测验
    [NOIP2014普及组]珠心算测验题目描述珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而......
  • LG2258 [NOIP2014 普及组] 子矩阵
    LG2258[NOIP2014普及组]子矩阵给出一个矩阵,求出一个子矩阵(对应在数列上的定义为子序列,从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵保持行与列的相对顺序......
  • LOJ #2500. 「NOIP2014」飞扬的小鸟
    题目链接:​​传送门​​不知不觉这么久没更了上了一阵子文化课,还比较颓没怎么做题就做了做noip历年的题也没什么好发的挑了一个,写了些注释#include<bits/stdc++.h>#def......