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.我 ...
随机推荐
- Android 距离传感器修复 修复打电话黑屏 无法快速唤醒屏幕的BUG
接触Android Xposed开发也很久了,学了这么久的Java,也该弄点东西出来了, public ProximitySensor(Context paramContext, AudioModeP ...
- openstack中彻底删除计算节点的操作记录
在使用openstack的过程中,我们经常会添加好几台计算节点来部署虚拟机,在后续使用中由于某些原因,一些计算节点出现了问题,需要将这些出了问题的计算节点从openstack的控制节点中踢出去!但是很 ...
- Windows Phone 简介
中文官网 https://dev.windowsphone.com/zh-cn Windows Phone SDK 7.1 http://www.microsoft.com/zh-cn/downloa ...
- HashMap 中的 entrySet()使用方法 2016.12.28
package map; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import ...
- MySQL基础 - 编码设置
刚开始工作的时候,在工作中遇到的与数据库相关的问题,多半跟编码有关,总结一下数据库编码的设置. 字符集 查看数据库支持的字符集: mysql> SHOW CHARACTER SET; 从图中可以 ...
- pandas 透视表 pivot_table
The function pandas.pivot_table can be used to create spreadsheet-style pivot tables. It takes a num ...
- 信息安全系统设计第二次&第四次实验
实验二 固件设计 实验步骤: 环境配置如同实验一,承接实验一. 1.在虚拟机中编译代码.对于多线程相关的代码,编译时需要加-lpthread 的库. 2.下载调试在超级终端中运行可执行文件 pthr ...
- 信息安全系统设计基础exp_1
详见搭档20135322郑伟博客链接:http://www.cnblogs.com/zhengwei0712/
- Maven in 5 Minutes(Windows)
这是根据官网的例子写的入门例子:http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html 1)下载maven: ...
- 学习笔记——Maven pom.xml配置详解
POM的全称是“ProjectObjectModel(项目对象模型)”. pom.xml详解 声明规范 <projectxmlns="http://maven.apache.org/P ...