传送门


总结:

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. C#代码规范 .NET程序员需要提升的修养

    一.  环境设置  首先去除VS开发环境中的一些选项如下: 粘贴时调整缩进 将类型的左大括号置于新行 将方法的左大括号置于新行 将匿名方法的左大括号置于新行 将控制块的左大括号置于新行 将“else” ...

  2. $watch方法

    监听一个model(表单),当一个model每次改变时,都会触发第二个参数函数 $scope.$watch('name',function(){});//name是model名<input ty ...

  3. android studio使用说明

    一.学习的基本配置文档,搞好各种参数的基本配置,熟练使用. C:\Program Files\Java\jdk1.7.0_09\bin   二.problems meet in weather and ...

  4. C语言 指针与字符串

    C语言可以在栈区 or 堆区 or 全局区 存放字符串,字符串不单单是存储在全局区的. //字符串与指针 #include<stdio.h> #include<stdlib.h> ...

  5. WCF与ASMX Web服务差异比较[译]

    First of all, it needs to understand that WCF Service provides all the capabilities of .NET web serv ...

  6. JS 之DOM对象(1)

    介绍DOM1中底层的一些属性和方法. 节点操作 appendChild() parentNode.appendChild(newNode)  在parentNode节点的最后插入newNode ins ...

  7. 开发机上绕过Chrome同源策略的办法

    开发机上绕过Chrome同源策略的办法 标签: Chrome同源策略跨域 2013-08-21 18:33 6071人阅读 评论(0) 收藏 举报  分类: Chrome扩展(1)  版权声明:本文为 ...

  8. 从0开始学java——JUnit4 复习,其实基本思想还是那些,不过采用了新的注释格式的语法

    看了深入探索 JUnit 4(http://www.ibm.com/developerworks/cn/education/java/j-junit4/index.html  ) 主要是讲了新的基于注 ...

  9. 系统级I/O 第八周11.1~11.8

    第十章 系统级I/O 输入输出I/O是在主存和外部设备(如磁盘,网络和终端)之间拷贝数据的过程.输入就是从I/O设备拷贝数据到主存,而输出就是从主存拷贝数据到I/O设备. 所有语言的运行时系统都提供执 ...

  10. openssl知识点总结

    openssl知识点总结 实践总结见之前博客:http://www.cnblogs.com/Jclemo/p/6091201.html 简介 openssl是一个功能丰富且自包含的开源安全工具箱.它提 ...