笔直的水管

文章目录

题目

描述 Description
奶牛们想把水从池塘运输到牛棚里,池塘和牛棚相距D个单位。它们有P根水管,每根水管由2个整数来描述:水管长度Li,最大流量Ci。
水管可以依次连接构成一条运输管道(下水道?),那么这条运输管道的流量就是构成这条管道的所有水管中最小的一个流量。
但是,要让水从池塘通过运输管道流到牛棚里,管道的长度必须恰好等于池塘和牛棚的距离(也就是说,水管长度Li之和为D)!
现在只要求构造一条运输管道,求其最大流量。
输入格式 Input Format
第1行:两个整数,D(7<=D<=100,000)和P(1<=P<=350);
第2…P+1行:每行两个整数Li和Ci(0<=Li,Ci<=2^24)。
输出格式 Output Format
一行仅一个整数,表示最大流量。
样例输入 Sample Input
7 6
4 5
3 6
2 7
1 4
6 7
1 5
样例输出 Sample Output
5

题解

01背包?
在dp时开个f数组记录当前重量下选取物品中的最小价值。

code

#include <bits/stdc++.h>
const int maxn = 5e5 + 10;
const int inf = 0x3f3f3f3f;

template <typename T>
inline void read(T &s) {
	s = 0;
	T ch = getchar(), w = 1;
	while (!isdigit(ch)) { if (ch == '-') w = -1; ch = getchar(); }
	while (isdigit(ch))  { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }
	s *= w;
}

int d;
int p;
int w[maxn];
int v[maxn];
int f[maxn];

int main() {
	read(d); read(p);
//	memset(f, 0x3f, sizeof(f));
	f[0] = inf;
	for (int i = 1; i <= p; ++i) read(w[i]), read(v[i]);
	for (int i = 1; i <= p; ++i) {
		for (int j = d; j >= w[i]; --j) {
			if (v[i] > f[j] && f[j] < f[j - w[i]]) {
				if (v[i] < f[j - w[i]]) f[j] = v[i];
				else f[j] = f[j - w[i]];
			}
		}
	}
	printf("%d\n", f[d]);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值