hihocoder #1270 建造基地

传送门

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

在遥远的未来,小Hi成为了地球联邦外空间联合开发工作组的一员,前往一颗新发现的星球开发当地的重金属资源。

为了能够在当地生存下来,小Hi首先要建立一个基地。建立基地的材料可以直接使用当地的石材和富裕的重金属资源。基地建设分为N级,每一级都需要达成K的建设值后才能够完成建设,当前级别的建设值溢出后不会影响到下一级的建设。

小Hi可以产出的重金属资源按照精炼程度分为M级,根据开采的数量和精炼的工艺,可以将获取精炼程度为第i级的重金属资源的成本量化为Ai

在建设第1级基地时,一块精炼度为i的重金属可以提供Bi的建设值,此后基地的级别每提高一级,建设值将除以T并下取整(整除)。

现给定N、M、K、T、A[]和B[],小Hi需要你帮助他计算他完成基地建设的最小成本。

输入

输入包含多组测试数据。

输入的第一行为一个整数Q,表示测试数据的组数。

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

接下来的一行为M个整数,分别表示A1~AM

接下来的一行为M个整数,分别表示B1~BM

对于100%的数据,满足1<=N<=10,1<=M<=100,1<=K,T<=104

对于100%的数据,满足Ai和Bi均为32位整型范围内的正整数

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

输出

对于每组测试数据,如果小Hi最终能够完成基地建设,则输出小Hi完成基地建设所需要的最小成本,否则输出“No Answer”。

样例输入
2
2 2 2 2
1 3
1 2
2 2 2 2
1 2
1 1
样例输出
   8
   No Answer

Solution:

DP。

各级基地的建设相互独立,建设某一级基地的最小成本是一个类多重背包问题:

$dp[i][j]表示利用前i级重金属资源获得至少j建设值所需的最小成本,转移方程:$

\[dp[i][j]=min(dp[i-1][j], dp[i][j-b[i]]+a[i])\]


Implementation:

由于DP状态中有“至少”二字,不能直接采用上面的转移方程(但这并不意味着它是错的),而是需要调整一下转移的方式(注意:是“方式”而非“方向”):

$从前一状态推到后一状态, 即从dp[i][j]推到dp[i+1][j]和dp[i][min(j+b[i], K)].$

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int M(105), K(1e4+5);
LL dp[M][K], INF=1LL<<60;
int a[M], b[M];

void upd(LL &x, LL y){
    x=~x?min(x, y):y;
}

int main(){
    int T, n, m, k, t;
    for(cin>>T; T--; ){
        cin>>n>>m>>k>>t;
        for(int i=1; i<=m; i++) cin>>a[i];
        for(int i=1; i<=m; i++) cin>>b[i];
        LL ans=0;
        bool f=true;
        for(int i=0; i<n; i++){
            memset(dp, -1, sizeof(dp));
            for(int i=0; i<=m; i++) dp[i][0]=0;
            for(int i=0; i<=m; i++)
                for(int j=0; j<=k; j++)
                    if(~dp[i][j]){
                        if(i<m) upd(dp[i+1][j], dp[i][j]);
                        if(i) upd(dp[i][min(k, j+b[i])], dp[i][j]+a[i]);
                    }
            if(~dp[m][k]) ans+=dp[m][k];
            else{f=false; break;}
            for(int i=1; i<=m; i++) b[i]/=t;
        }
        if(f) cout<<ans<<endl; else puts("No Answer");
    }
    return 0;
}
时间: 2024-10-18 16:36:01

hihocoder #1270 建造基地的相关文章

关于缺氧(OxygenNotIncluded)的一些零碎想法

1.背景. 介绍过于简单,仅仅说"不知道为什么出现在星球地底"十分缺少游戏代入感. 个人想法:地球资源匮乏,人类无法继续生存,此时研究出了"随机星球跳跃"的科技,遂从全地球随机抽取人口样本数据,生成复制人随机投放到各个星球(解释每次随机生成地形不一样的原因),尝试建立新星球的前站,为未来人口迁徙做先行军. 2.游戏操作/可玩性. 其实一个鼠标已经可以完成全部的操作,但是还是有很多的不足之处. 第一是游戏没有"移动建造物"的功能,只能拆除后重建,这

hdu1173 中位数

采矿 Problem Description 某天gameboy玩魔兽RPG.有一个任务是在一个富含金矿的圆形小岛上建一个基地,以最快的速度采集完这个小岛上的所有金矿.这个小岛上有n(0<n<1000000)个金矿,每个金矿的矿藏量是相等的.而且这个小岛的地势非常平坦,所以基地可以建在小岛的任何位置,每个金矿的采矿速度只跟矿藏到基地的路程长度有关.为了不让这个任务太无聊,游戏设计者对这个小岛施了个“魔法”,规定矿工在小岛上只能正南正北正西正东走.也就是说矿工不能斜着在岛上走. 这个小岛在一个二

【军工行业深度报告一】军工2015:国防和经济双轮驱动三五年行情

[军工行业深度报告一]军工2015:国防和经济双轮驱动三五年行情 i投资i投资(微信号:itouzi8)“VIP会员俱乐部”旨在搭建专业的产业链研究社群.通过汇集产业专家.行业分析师.PE/VC.上市公司及实业高管和职业投资人,一起进行深入.全面.前瞻性的产业链研究,发掘股权.股票市场的投资机会.作者:西点老A(i投资线上研究院-军工北斗研究团队首席研究员.i投资VIP会员) 1.对于2015年的军工行业,我个人是强烈看好,但是玩军工一定要把握好军工标的质量和军工股巨大波动性的特点,对于2015

hihoCoder #1097 最小生成树之Prim算法

原题网址,http://hihocoder.com/problemset/problem/1097 #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但 是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就 可以使得任意两座城市都可以通过所建

hihoCoder #1109 最小生成树之堆优化的Prim算法

原题地址:http://hihocoder.com/problemset/problem/1109 #1109 : 最小生成树三·堆优化的Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 回到两个星期之前,在成功的使用Kruscal算法解决了问题之后,小Ho产生了一个疑问,究竟这样的算法在稀疏图上比Prim优化之处在哪里呢? 提示:没有无缘无故的优化! 输入 每个测试点(输入文件)有且仅有一组测试数据. 在一组测试数据中: 第1行为2个整数N.M,表示小

不要困在自己建造的盒子里——写给.NET程序员(附精彩评论)

转自:http://kb.cnblogs.com/page/92260/ 此文章的主旨是希望过于专注.NET程序员在做好工作.写好.NET程序的同时,能分拨出一点时间接触一下.NET之外的东西(例如10%-20%的时间),而不是鼓动大家什么都去学最后什么都学不精,更不是说.NET不行或劝大家放弃.NET.恕我愚钝,此主旨在文中表达不够清楚,看评论中很多朋友误解了,特此说明. 另外,本文中的观点并不全部是我个人的想法,相当一部分来自我以前聊过天的某些大牛,他们很多来自微软.百度.腾讯等知名企业,并

设计模式之七:建造模式(Builder Pattern)

建造者模式就是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示. 适用范围: 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不同表示时. 建造者模式里面有四个角色: Builder: 给出一个抽象接口,以规范产品对象的各个组成部分的建造.一般而言,此接口独立于应用程序的业务逻辑.模式中直接创建产品对象的具体创建者角色.具体创建者角色必须实现这个接口的所有方法:一个是建造方法,另一个是结果返还方法. ConcreteBu

[hihoCoder#1381]Little Y&#39;s Tree

[hihoCoder#1381]Little Y's Tree 试题描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每次小J会删掉这个树中的k条边,这棵树被分成k+1个连通块.小J想知道每个连通块中最远点对距离的和. 这里的询问是互相独立的,即每次都是在小Y的原树上进行操作. 输入 第一行一个整数n,接下来n-1行每行三个整数u,v,w,其中第i行表示第i条边边权为wi,连接了ui,vi两点. 接下来一行一个整数q,表示有q组询问. 对于每组询问,第一行一个正整数k,接下来一

hihoCoder 1175:拓扑排序二

题目链接: http://hihocoder.com/problemset/problem/1175 题目难度:一星级(简单题) 今天闲来无事,决定刷一道水题.结果发现这道水题居然把我卡了将近一个钟头. 最后终于调通了.总结起来,原因只有一个:不够仔细. 思路不用细说了,就是拓扑排序的简单应用.然而,一些不起眼的细节才是让你掉坑里的真正原因. 猜猜哪儿可能出bug? // A simple problem, but you can't be too careful with it. #inclu