题目链接  飞扬的小鸟

考场的70分暴力(实际只有50分因为数组开小了……)

考场代码(数组大小已修改)

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define LL long long
#define fi first
#define se second const int INF = << ;
const int N = + ;
const int M = + ; int dp[M][N], x[N], y[N], u[N], d[N];
int n, m, q, ans, xn, ln, rn, _max, pos;
bool c[N]; int main(){ scanf("%d %d %d ", &n, &m, &q);
rep(i, , n - ) scanf("%d %d ", x + i, y + i);
rep(i, , n) u[i] = m, d[i] = ;
memset(c, false, sizeof c);
rep(i, , q){
scanf("%d %d %d ", &xn, &ln, &rn);
c[xn] = true;
u[xn] = rn - ;
d[xn] = ln + ;
}
//rep(i, 0, n) printf("%d %d\n", d[i], u[i]);
memset(dp, 0xff70, sizeof dp);_max = dp[][];
rep(i, , m) dp[][i] = ;
rep(i, , n - ){
rep(j, d[i], u[i]){
if (dp[i][j] >= _max) continue;
int k = j - y[i];
if (k >= && k <= m) dp[i + ][k] = min(dp[i + ][k], dp[i][j]);
k = j;int num = ;
while (true){
k += x[i]; ++num;
if (k > m) k = m;
if (k >= && k <= m) dp[i + ][k] = min(dp[i + ][k], dp[i][j] + num);
if (k == m) break;
}
}
} ans = _max;
rep(i, , m) ans = min(ans, dp[n][i]);
if (ans < _max){
printf("%d\n%d\n", , ans);return ;
} bool flag = false;
ans = ;
dec(i, n, ) {rep(j, , m) if (dp[i][j] < _max) { pos = i - ;flag = true; break;} if (flag) break;}
dec(i, pos, ) if (c[i]) ++ans;
printf("%d\n%d\n", , ans); return ;
}

然后回过来想正解。

其实我们把很多时间都浪费在这里了:

     while (true){
k += x[i]; ++num;
if (k > m) k = m;
if (k >= && k <= m) dp[i + ][k] = min(dp[i + ][k], dp[i][j] + num);
if (k == m) break;
}

其实这一步可以转过来直接利用完全背包的性质优化一下。转移只要O(1)就可以了。

这道题细节还是很多的,比较容易写挂。

正解:

 #include <bits/stdc++.h>

 using namespace std;

 #define rep(i, a, b)    for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int INF = << ;
const int N = + ;
const int M = + ; int dp[N][M], x[N], y[N], u[N], d[N];
int n, m, q, ans, xn, ln, rn, _max, pos;
bool c[N]; int main(){ scanf("%d %d %d ", &n, &m, &q);
u[n] = m + ; d[n] = ;
rep(i, , n - ) scanf("%d %d ", x + i, y + i), u[i] = m + , d[i] = ; rep(i, , q){
scanf("%d %d %d ", &xn, &ln, &rn);
u[xn] = rn;
d[xn] = ln;
} rep(i, , n + ) rep(j, , m + ) dp[i][j] = INF; rep(i, , m) dp[][i] = ;
rep(i, , n){
rep(j, x[i - ], m){
dp[i][j] = min(dp[i][j], dp[i - ][j - x[i - ]] + );
dp[i][j] = min(dp[i][j], dp[i][j - x[i - ]] + );
} rep(j, m - x[i - ], m){
dp[i][m] = min(dp[i][m], dp[i - ][j] + );
dp[i][m] = min(dp[i][m], dp[i][j] + );
} rep(j, d[i] + , u[i] - ){
if (j + y[i - ] <= m) dp[i][j] = min(dp[i][j], dp[i - ][j + y[i - ]]);
} rep(j, , d[i]) dp[i][j] = INF;
rep(j, u[i], m) dp[i][j] = INF;
} ans = INF;
rep(i, , m) ans = min(ans, dp[n][i]);
if (ans != INF) return , printf("%d\n%d\n", , ans);
int t = q;
dec(i, n, ){
rep(j, , m) ans = min(ans, dp[i][j]);
if (ans != INF) break;
if (u[i] != m + ) --t;
} printf("%d\n%d\n", , t);
return ;
}

NOIP 2014飞扬的小鸟(DP优化)的更多相关文章

  1. NOIp 2014飞扬的小鸟【dp】By cellur925

    题目传送门 放在14年Day1T3的dp题目...应该比较看出来是dp算法吧,因为在本蒟蒻看来求最值的算法不清晰时就是dp了==. 状态还是比较好设计的,考虑到每个情况需要记录下的量:f[i][j]表 ...

  2. [NOIp 2014]飞扬的小鸟

    Description Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉 ...

  3. 飞扬的小鸟 DP

    飞扬的小鸟 DP 细节有点恶心的DP,设\(f[i][j]\)表示横坐标为\(i\)(从\(0\)开始)高度为\(j\)时,屏幕点击的最小次数为\(f[i][j]\),转移便很好写了,这里要注意枚举当 ...

  4. [NOIP2014]飞扬的小鸟[DP]

    [NOIP2014]飞扬的小鸟 ——!x^n+y^n=z^n 题目描述: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...

  5. NOIP 提高组 2014 飞扬的小鸟(记录结果再利用的DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 参考资料: [1]:https://www.luogu.org/blog/xxzh242 ...

  6. P1941 飞扬的小鸟[dp]

    题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣 ...

  7. NOIP2014飞扬的小鸟[DP][WRONG]

    坑人啊朴素的dp 75分 用了完全背包才是80分,结果普遍偏小 为什么啊啊啊啊啊 等以后再写一遍吧 #include<iostream> #include<cstdio> #i ...

  8. luogu1941 [NOIp2014]飞扬的小鸟 (dp)

    设f[i][j]为到达(i,j)这个位置的最小操作数 就有$f[i][j]=min\{f[i-1][j+Y[i-1]],f[i-1][j-X[i-1]*k]+k\}$ 然后考虑优化一下转移: 对于一系 ...

  9. NOIP 2014

    Prob.1 生活大爆炸版 石头剪刀布 模拟.代码: #include<cstdio> #include<cstring> #include<iostream> u ...

随机推荐

  1. 快速排序算法(C)

    sort快排函数的基本版,效率n*logn,快排的完全版就是在递归之中夹杂对序列的预判断,最优的选择排序方法,快速排序算法只是其中之一. 简单的说明一下快速排序的思想,对于一个数列,首先选择一个基数( ...

  2. C#编程:正则表达式验证身份证校验码-10

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. loj2537 「PKUWC 2018」Minimax

    pkusc 快到了--做点题涨涨 rp. 初见时 yy 了一个类似于归并的东西,\(O(n^2)\),50 分. 50 分 yy 做法 对于一个点,枚举他能到达的权值(假设这个权值在左子树,在右子树是 ...

  4. JS空数组的判断

    前言 最近在做一个mini项目,被大神各种鄙视,基础知识确实是不扎实,加油加油.好了,不多废话,抽空写写遇到的两个知识点,就记录下来,写博客还是能帮忙整理记录的,不然过了就忘记了. input监听值改 ...

  5. 69、Android 布局中轻松实现图片的全屏、居中、平铺

    public void paint() { if (item.laying_mode != 1)//平铺或者充满 { new AsyncTask<Void, Void, Void>() { ...

  6. Marketing learning-3

    Part five brand mantra: the elevator speed 1.mental map:Portrays brand associations and responses fo ...

  7. IOS开发学习笔记036-UIScrollView-循环自动滚动

    实现scrollView的自动循环滚动,需要实现几个方法. 其中scrollView中始终保存三张图片,其他的图片在滚动到时再进行加载. 循环的实现主要是在setUpdate 中,如果索引为0是第一个 ...

  8. Python常见数据类型及操作

    基础数据类型 什么是数据类型? 我们人类可以很容易的分清数字与字符的区别,但计算机并不能,计算机虽然很强大,但从某种角度上看又很傻,除非你明确的告诉它,1是数字,“汉”是文字,否则它是分不清1和‘汉’ ...

  9. springmvc支持跨域的请求(复制)

    Spring MVC 新增跨域支持 发表于2017/5/8 22:01:24  48人阅读 分类: SpringMVC Spring MVC 4.2 增加 CORS 支持 跨站 HTTP 请求(Cro ...

  10. 习题:过路费(kruskal+并查集+LCA)

    过路费  [问题描述]在某个遥远的国家里,有 n 个城市.编号为 1,2,3,…,n.这个国家的政府修 建了 m 条双向道路,每条道路连接着两个城市.政府规定从城市 S 到城市 T 需 要收取的过路费 ...