HNU 12961 BitTorrent DP

题意:

  你在网上下载东西,一个文件存储在一段或者多段里面,问怎么选择能在规定的流量内下载最多的文件数量。每段的大小一样。

思路:

  习惯了做答案保存在DP数组里的题,做这种答案保存在下标里的题,转不过弯来。开始想过背包,但是一来内存不够,二来时间也不够。

  其实是这样做的,dp[i][j][0/1]保存枚举到第i个,下载了j个,最后一个是否被下载的最小花费。 最后找花费没超过限制的最大值就好了。

  最后值得注意的是,最后一段的时候,可能不会被p整除,不要算多了哦。

代码:

  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <string>
 8 #include <queue>
 9 #include <stack>
10 #include <vector>
11 #include <map>
12 #include <set>
13 #include <functional>
14 #include <cctype>
15 #include <time.h>
16
17 using namespace std;
18
19 const int INF = 1<<30;
20 const int MAXN = 3055;
21
22 int dp[MAXN][MAXN][2]; //dp[i][j][k] 表示取到第i个,取了j个,的时候,第i个取或者不取
23 int a[MAXN];
24 int sum[MAXN]; //前缀和
25 int n, p, l;
26
27 int main() {
28     #ifdef Phantom01
29         freopen("HNU12961.in", "r", stdin);
30     #endif //Phantom01
31
32     while (scanf("%d%d%d", &n, &p, &l)!=EOF) {
33         if (n==0&&p==0&&l==0) break;
34
35         sum[0] = 0;
36         for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
37         for (int i = 1; i <= n; i++) sum[i] = sum[i-1]+a[i];
38         for (int i = 0; i <= n; i++)
39             for (int j = 0; j <= n; j++)
40                 dp[i][j][0] = dp[i][j][1] = INF;
41         dp[0][0][0] = 0;
42
43         for (int i = 1; i <= n; i++) {
44             for (int j= 0; j <= i; j++)
45                 dp[i][j][0] = min(dp[i-1][j][0], dp[i-1][j][1]);
46             for (int j = 1; j <= i; j++)
47                 dp[i][j][1] = min(dp[i-1][j-1][0]-(sum[i-1]/p)*p,
48                                   dp[i-1][j-1][1]-((sum[i-1]+p-1)/p)*p)
49                               + (i==n ? sum[i] : ((sum[i]+p-1)/p)*p);
50         }
51         int ans = 0;
52         for (int i = 0; i <= n; i++)
53             if (dp[n][i][0]<=l || dp[n][i][1]<=l)
54                 ans = max(ans, i);
55         printf("%d\n", ans);
56     }
57
58     return 0;
59 }

时间: 2024-10-13 10:16:30

HNU 12961 BitTorrent DP的相关文章

dp - HNU 13404 The Imp

The Imp Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13404&courseid=0 Mean: n个物品,每个物品价值为v,价格为c,你只可以带一个物品离开. 有一个精灵,它可以施法让你购买后的物品价值变为0(未离开商店之前),精灵最多施k次法术. 你的目的是让自己获得最大收益,而小鬼的目的正好相反.如果你和精灵都采用最优策略,最后你可以盈利多少? analyse: 第一感觉是

【AC自动机+DP】HNU 13108 Just Another Knapsack Problem

通道:http://acm.hnu.cn/online/?action=problem&type=show&id=13108&courseid=296 题意:N个匹配串及权值,求完全匹配模式串的最大值. 思路:建AC自动机,dp[i]到达i的最大值,dp[i]=max(dp[i-L]+W); 代码:https://github.com/Mithril0rd/Rojo/blob/master/hnu13108.cpp

HNU 13108-Just Another Knapsack Problem (ac自动机上的dp)

题意: 给你一个母串,多个模式串及其价值,求用模式串拼接成母串(不重叠不遗漏),能获得的最大价值. 分析: ac自动机中,在字典树上查找时,用dp,dp[i]拼成母串以i为结尾的子串,获得的最大价值,dp[i]=max(dp[i],dp[i-len]+val[tmp]).,len是模式串的长度,val[tmp]为其价值. #include <cstdio> #include <cstring> #include <cmath> #include <queue>

HNU OJ10086 挤挤更健康 记忆化搜索DP

挤挤更健康 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 339, Accepted users: 216 Problem 10086 : No special judgement Problem description 用边长小于N的正方形方砖(注意,不要求所有的方砖大小相同,请看样例说明)不重叠地铺满N*N的正方形房间,最少要几块方砖. Input 第一行是一个整

HNU Cent Savings (DP)

Cent Savings Time Limit: 5000ms, Special Time Limit:12500ms, Memory Limit:65536KB Total submit users: 54, Accepted users: 36 Problem 13345 : No special judgement Problem description To host a regional contest like NWERC a lot of preparation is necess

HNU 13108 Just Another Knapsack Problem DP + Trie树优化

题意: 给你一个文本串,和一些模式串,每个模式串都有一个价值,让你选一些模式串来组成文本串,使获得的价值最大.每个模式串不止能用一次. 思路: 多重背包,枚举文本串的每个位置和模式串,把该模式串拼接在当前位置,看下一个位置是否能得到更优值.但是,存在很多模式串不能拼在当前位置的,无效状态.所以可以用Trie树来优化转移. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <c

莫比乌斯反演 - HNU 13412 Cookie Counter

Cookie Counter Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13412&courseid=0 Mean: 将N分为D份,每份不超过X,有多少种分法? analyse: 莫比乌斯反演的运用. 首先我们想到的是迭代,但是数据太大,一路迭代下去必定爆栈+超内存+TLE. 那么就需要用莫比乌斯反演来优化多项式求和.我们枚举X,对于满足条件的X,使用莫比乌斯反演求和统计答案,不满足条

Kademlia、DHT、KRPC、BitTorrent 协议、DHT Sniffer

catalogue 0. 引言 1. Kademlia协议 2. KRPC 协议 KRPC Protocol 3. DHT 公网嗅探器实现(DHT 爬虫) 4. BitTorrent协议 5. uTP协议 6. Peer Wire协议 7. BitTorrent协议扩展与ut_metadata和ut_pex(Extension for Peers to Send Metadata Files) 8. 用P2P对等网络思想改造C/S.B/S架构的思考 0. 引言 平常我们高端用户都会用到BT工具来

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include