传送门


总结:

1.仔细读题

2.仔细分析复杂度

3.不要想当然,乱下结论


时间限制:5000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi、小Ho还有被小Hi强拉来的小Z,准备组队参加一个智力竞赛。竞赛采用过关制,共计N个关卡。在第i个关卡中,小Hi他们需要获得Ai点分数才能够进入下一关。每一关的分数都是独立计算的,即使在一关当中获得超过需要的分数,也不会对后面的关卡产生影响。

小Hi他们可以通过答题获得分数。答对一道题获得S点分数,答错一道题获得T点分数。在所有的N个关卡中,小Hi他们一共有M次答题机会。在每个关卡中,都可以在累计答题次数不超过M的情况下使用任意次的答题机会。

那么现在问题来了,对于给定的N、M、S、T和A,小Hi他们至少需要答对多少道题目才能够完成所有的关卡呢?

输入

每个输入文件包含多组测试数据,在每个输入文件的第一行为一个整数Q,表示测试数据的组数。

每组测试数据的第一行为四个正整数N、M、S和T,意义如前文所述。

第二行为N个正整数,分别表示A1~AN

对于40%的数据,满足1<=N,M<=100

对于100%的数据,满足1<=N,M<=1000,1<=T<S<=10,1<=Ai<=50

对于100%的数据,满足1<=Q<=100

输出

对于每组测试数据,如果小Hi他们能够顺利完成关卡,则输出一个整数Ans,表示小Hi他们至少需要答对的题目数量,否则输出No

样例输入
1
2 10 9 1
12 35
样例输出
   5

Solution:
$dp[i][j]: 通过第i关后共答了j题,至少要答对的题数$.

实现:从当前状态向后推比较好写.

Implementation:

Version I(朴素)  1145ms

#include <bits/stdc++.h>
using namespace std;
typedef long long LL; const int N(1e3+); int n, m, s, t, T, dp[N][N], a[N]; void upd(int &x, int y){
x=min(x, y);
} int main(){
for(cin>>T; T--; ){
cin>>n>>m>>s>>t;
for(int i=; i<=n; i++) cin>>a[i];
memset(dp, 0x3f, sizeof(dp));
for(int i=; i<=m; i++) dp[][i]=;
for(int i=; i<n; i++)
for(int j=; j<m; j++)
for(int k=; k<=(a[i+]-)/s+; k++){
int now=k;
if(a[i+]-k*s>) now+=(a[i+]-k*s-)/t+;
if(j+now<=m) upd(dp[i+][j+now], dp[i][j]+k);
}
int ans=INT_MAX;
for(int i=n; i<=m; i++) ans=min(ans, dp[n][i]);
if(ans>m) puts("No"); else cout<<ans<<endl;
}
return ;
}

Version II(稍加优化)  289ms

#include <bits/stdc++.h>
using namespace std;
typedef long long LL; const int N(1e3+); int n, m, s, t, T, dp[N][N], a[N]; void upd(int &x, int y){
if(!~x) x=y; else x=min(x, y);
} int main(){
for(cin>>T; T--; ){
cin>>n>>m>>s>>t;
for(int i=; i<=n; i++) cin>>a[i];
memset(dp, -, sizeof(dp));
dp[][]=;
for(int i=; i<n; i++)
for(int j=; j<=m; j++)
if(~dp[i][j]){
int tot=INT_MAX;
for(int k=; k<=(a[i+]-)/s+; k++){
int now=k;
if(a[i+]-k*s>) now+=(a[i+]-k*s-)/t+;
if(now==tot || j+now>m) continue;
// dp[i+1][j+now]=dp[i][j]+k;
upd(dp[i+][j+now], dp[i][j]+k);
tot=now;
}
}
int ans=INT_MAX;
for(int i=n; i<=m; i++) if(~dp[n][i]) ans=min(ans, dp[n][i]);
if(ans==INT_MAX) puts("No"); else cout<<ans<<endl;
}
return ;
}

最初犯的错误:共4处

#include <bits/stdc++.h>
using namespace std;
typedef long long LL; const int N(1e3+); int n, m, s, t, T, dp[N][N], a[N]; int main(){
for(cin>>T; T--; ){
cin>>n>>m>>s>>t;
for(int i=; i<=n; i++) cin>>a[i];
memset(dp, -, sizeof(dp));
dp[][]=;
for(int i=; i<n; i++)
for(int j=; j<=m; j++)
if(~dp[i][j]){
int tot=INT_MAX;
for(int k=; k<=(a[i+]-)/s+; k++){
int now=k;
if(a[i+1]-k*s) now+=(a[i+]-k*s-)/t+;
if(now>=tot || j+now>m) continue;
dp[i+1][j+now]=dp[i][j]+k;
now=tot;
}
}
int ans=INT_MAX;
for(int i=n; i<=m; i++) if(~dp[n][i]) ans=min(ans, dp[n][i]);
if(ans==INT_MAX) puts("NO"); else cout<<ans<<endl;
}
return ;
}

"No"打成“NO"WA到吐血。。。。

hihocoder #1285 智力竞赛的更多相关文章

  1. [Offer收割]编程练习赛3 - 题目3 : 智力竞赛

    智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...

  2. 【BZOJ5335】[TJOI2018]智力竞赛(二分图匹配)

    [BZOJ5335][TJOI2018]智力竞赛(二分图匹配) 题面 BZOJ 洛谷 题解 假装图不是一个DAG想了半天,.发现并不会做. 于是假装图是一个DAG. 那么显然就是二分答案,然后求一个最 ...

  3. loj#2574. 「TJOI2018」智力竞赛 (路径覆盖)

    目录 题目链接 题解 代码 题目链接 loj#2574. 「TJOI2018」智力竞赛 题解 就是求可重路径覆盖之后最大化剩余点的最小权值 二分答案后就是一个可重复路径覆盖 处理出可达点做二分图匹配就 ...

  4. BZOJ5335:[TJOI2018]智力竞赛——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5335 小豆报名参加智力竞赛,他带上了n个好朋友作为亲友团一块来参加比赛. 比赛规则如下: 一共有m ...

  5. hihocoder-1285 智力竞赛(区间dp)

    智力竞赛 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi.小Ho还有被小Hi强拉来的小Z,准备组队参加一个智力竞赛.竞赛采用过关制,共计N个关卡.在第i个关卡中,小 ...

  6. 【hiho一下 第145周】智力竞赛

    [题目链接]:http://hihocoder.com/contest/hiho145/problem/1 [题意] [题解] 设f[i][j]表示做对i道题,做错j道题能够到达的最好状态是什么; 这 ...

  7. BZOJ5335 : [TJOI2018]智力竞赛

    二分答案,转化成求最少的路径,覆盖住所有权值$\leq mid$的点. 建立二分图,若$i$的后继为$j$,则连边$i\rightarrow j$,求出最大匹配,则点数减去最大匹配数即为最少需要的路径 ...

  8. 洛谷P4589 [TJOI2018]智力竞赛(二分答案 二分图匹配)

    题意 题目链接 给出一个带权有向图,选出n + 1n+1条链,问能否全部点覆盖,如果不能,问不能覆盖的点权最小值最大是多少 Sol TJOI怎么净出板子题 二分答案之后直接二分图匹配check一下. ...

  9. [TJOI2018]智力竞赛【网络流】

    题解: 这垃圾题意 问题二分之后等价于 可重复路径判断能否覆盖一张图 1.用floyd连边(来保证可重复) 然后拆点跑最大流 然后答案=n-最大流 但这样子做本来复杂度就比较高,边数增加了n倍 2.我 ...

随机推荐

  1. 20SpringMvc_结果的转发可共享参数;重定向不能共享参数

    Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* Style Definiti ...

  2. ruby 元编程

    一 对象模型 kernel Module Kernel.private_instance_methods.grep(/^pr/)   private method 1 如果一个方法接收者不是你自己,一 ...

  3. findstr()与strfind()的区别

    matlab中这两个字符串查找的函数findstr(), strfind()表明上看起来用法相似,效果也相似. 1. findstr(s1,s2)--在较长的字符串中查找较短的字符串出现的次数,并返回 ...

  4. 蓝牙技术BlueTooth

    转载网址:http://blog.csdn.net/dxdxsmy/article/details/7790568 蓝牙核心架构概念的理解请参考上面的网址.

  5. zoeDylan.js框架-数据底层

    zoeDylan.js是墨芈自己写的一套前端框架,不过由于墨芈经验不足,所以框架内部代码有些混乱. 墨芈写这套框架的目的是为了存储以后做前端开发过程中的一些代码,简单的说这套框架就是一个大杂烩. 这套 ...

  6. 嵌入式Linux利用Wifi搭建无线服务器(物联网实践之无线网关)

    在 http://www.cnblogs.com/heat-man/p/4564539.html中,在嵌入式Linux开发板上我们从最底层实现了一个智能家居的远程控制系统,然而采取的是用网线连接到交换 ...

  7. Thinkphp 边学边用-验证码无意间犯的错

    先看代码: $(".verify_img").click(function(){ var timenow = new Date().getTime(); var url =&quo ...

  8. iOS简易柱状图(带动画)--新手入门篇

    叨逼叨 好久没更新博客了,才几个月,发生了好多事情,处理了好多事情.不变的是写代码依然在继续. 做点啥子 看看objective-c的书,学着写了个柱状图,只是练习的demo而已,iOS上的图表控件已 ...

  9. jdbc基础 (三) 大文本、二进制数据处理

    LOB (Large Objects)   分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有B ...

  10. 13.C#分部类型和静态类(七章7.1-7.2)

    再大的东西不去找,也就没了,再小的知识不去记,也就忘了.今天来写一写C#中的分部类型和静态工具类,这些两个概念可能在我们的日常使用过程中都使用过,可能大家对这些内容觉得这些不是应该有的东西嘛,那就来复 ...