hihocoder #1285 智力竞赛
总结:
1.仔细读题
2.仔细分析复杂度
3.不要想当然,乱下结论
描述
小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
实现:从当前状态向后推比较好写.
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 智力竞赛的更多相关文章
- [Offer收割]编程练习赛3 - 题目3 : 智力竞赛
智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...
- 【BZOJ5335】[TJOI2018]智力竞赛(二分图匹配)
[BZOJ5335][TJOI2018]智力竞赛(二分图匹配) 题面 BZOJ 洛谷 题解 假装图不是一个DAG想了半天,.发现并不会做. 于是假装图是一个DAG. 那么显然就是二分答案,然后求一个最 ...
- loj#2574. 「TJOI2018」智力竞赛 (路径覆盖)
目录 题目链接 题解 代码 题目链接 loj#2574. 「TJOI2018」智力竞赛 题解 就是求可重路径覆盖之后最大化剩余点的最小权值 二分答案后就是一个可重复路径覆盖 处理出可达点做二分图匹配就 ...
- BZOJ5335:[TJOI2018]智力竞赛——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5335 小豆报名参加智力竞赛,他带上了n个好朋友作为亲友团一块来参加比赛. 比赛规则如下: 一共有m ...
- hihocoder-1285 智力竞赛(区间dp)
智力竞赛 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi.小Ho还有被小Hi强拉来的小Z,准备组队参加一个智力竞赛.竞赛采用过关制,共计N个关卡.在第i个关卡中,小 ...
- 【hiho一下 第145周】智力竞赛
[题目链接]:http://hihocoder.com/contest/hiho145/problem/1 [题意] [题解] 设f[i][j]表示做对i道题,做错j道题能够到达的最好状态是什么; 这 ...
- BZOJ5335 : [TJOI2018]智力竞赛
二分答案,转化成求最少的路径,覆盖住所有权值$\leq mid$的点. 建立二分图,若$i$的后继为$j$,则连边$i\rightarrow j$,求出最大匹配,则点数减去最大匹配数即为最少需要的路径 ...
- 洛谷P4589 [TJOI2018]智力竞赛(二分答案 二分图匹配)
题意 题目链接 给出一个带权有向图,选出n + 1n+1条链,问能否全部点覆盖,如果不能,问不能覆盖的点权最小值最大是多少 Sol TJOI怎么净出板子题 二分答案之后直接二分图匹配check一下. ...
- [TJOI2018]智力竞赛【网络流】
题解: 这垃圾题意 问题二分之后等价于 可重复路径判断能否覆盖一张图 1.用floyd连边(来保证可重复) 然后拆点跑最大流 然后答案=n-最大流 但这样子做本来复杂度就比较高,边数增加了n倍 2.我 ...
随机推荐
- GridControl控件绑定RepositoryItemImageComboBox 作为下拉框使用
如果,时间长时了,已前做过的东西,都记不得了,所以记录一下. 废话不多说. 1.拖出gridview控件,然后将字段绑定上去 2.将要做下拉框的控件加入RepositoryItemImageCombo ...
- 由源码密码文件转转化成keystore
1.android 源码目录build\target\product\security 取platform.pk8 platform.x509.pem放到一个目录下 E:\sign\convert ...
- connect函数详解
不得不说,客户端的connect函数和服务端的accept函数是一对好基友,如果客户端没有去connect, 那么服务端的accept会一直在那里傻傻地痴痴地等待,我们先来看看connect函数的原型 ...
- OpenGL、Open Inventor、WebGL、Three.js、ARToolkit、JSARToolkit
[准备看的] http://www.hewebgl.com/ http://www.linuxdiyf.com/viewarticle.php?id=399205 http://blog.sina.c ...
- Linux 读书笔记 一
一.Linux 简介 实验介绍 本节主要介绍 Linux 的历史,Linux 与 Windows 的区别等入门知识.如果你已经有过充分的了解,可以跳过本节,直接进入下一个实验. 一.Linux 为何物 ...
- iOS开发--应用设置及用户默认设置——转载
[链接]iOS开发--应用设置及用户默认设置[1.bundlehttp://www.jianshu.com/p/6f2913f6b218 在iphone里面,应用都会在“设置”里面有个专属的应用设置, ...
- 34 Sources for Test Ideas
We recommend collecting test ideas continuously from a variety of information sources. Consider the ...
- IT应届生如何准备找工作?
今天和一个弟弟吃饭,他明年年初即将计算机研究生毕业.谈论到怎么找工作,觉得自己会的不多,心里非常发虚.虽然我当年找工作也走了很多弯路,思路并不是很清晰.但是工作了这么多年,对企业需要什么样子的人还是有 ...
- fis-receiver:一行命令将项目部署到远程服务器
前言 本项目基于FIS2,没了.其实fis项目本身就提供了php版本的范例,这里翻译成node版本. 项目地址:https://github.com/chyingp/fis-receiver 服务端接 ...
- PDA设备小知识--(IP)工业防护等级含义
IP(INTERNATIONAL PROTECTION)防护等级是专门的工业防护等级,,它将电器依其防尘.防湿气之特性加以分级.IP防护等级是由两个数字所组成,第1个数字表示电器离尘.防止外物侵入的等 ...