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.我 ...
随机推荐
- C#代码规范 .NET程序员需要提升的修养
一. 环境设置 首先去除VS开发环境中的一些选项如下: 粘贴时调整缩进 将类型的左大括号置于新行 将方法的左大括号置于新行 将匿名方法的左大括号置于新行 将控制块的左大括号置于新行 将“else” ...
- $watch方法
监听一个model(表单),当一个model每次改变时,都会触发第二个参数函数 $scope.$watch('name',function(){});//name是model名<input ty ...
- android studio使用说明
一.学习的基本配置文档,搞好各种参数的基本配置,熟练使用. C:\Program Files\Java\jdk1.7.0_09\bin 二.problems meet in weather and ...
- C语言 指针与字符串
C语言可以在栈区 or 堆区 or 全局区 存放字符串,字符串不单单是存储在全局区的. //字符串与指针 #include<stdio.h> #include<stdlib.h> ...
- WCF与ASMX Web服务差异比较[译]
First of all, it needs to understand that WCF Service provides all the capabilities of .NET web serv ...
- JS 之DOM对象(1)
介绍DOM1中底层的一些属性和方法. 节点操作 appendChild() parentNode.appendChild(newNode) 在parentNode节点的最后插入newNode ins ...
- 开发机上绕过Chrome同源策略的办法
开发机上绕过Chrome同源策略的办法 标签: Chrome同源策略跨域 2013-08-21 18:33 6071人阅读 评论(0) 收藏 举报 分类: Chrome扩展(1) 版权声明:本文为 ...
- 从0开始学java——JUnit4 复习,其实基本思想还是那些,不过采用了新的注释格式的语法
看了深入探索 JUnit 4(http://www.ibm.com/developerworks/cn/education/java/j-junit4/index.html ) 主要是讲了新的基于注 ...
- 系统级I/O 第八周11.1~11.8
第十章 系统级I/O 输入输出I/O是在主存和外部设备(如磁盘,网络和终端)之间拷贝数据的过程.输入就是从I/O设备拷贝数据到主存,而输出就是从主存拷贝数据到I/O设备. 所有语言的运行时系统都提供执 ...
- openssl知识点总结
openssl知识点总结 实践总结见之前博客:http://www.cnblogs.com/Jclemo/p/6091201.html 简介 openssl是一个功能丰富且自包含的开源安全工具箱.它提 ...