HourRank 10:Accessory Collection
2016-07-07 18:45
323 查看
题目链接:https://www.hackerrank.com/contests/hourrank-10/challenges/accessory-collection
题意是1到A,A种物品,第i种物品价值为i,你要买L件,要求满足的条件是,买的L件物品中,任意挑选N件,其种类至少要有D种。问物品的总价值最大是多少。
做的时候很懵。。。贪了一下,只过了样例。
经过鸟神的翻译之后,题意可以简化如下对于1<=i<=A,要构造一个数组,使得sum a[i] = L,然后b是a排好序之后,b的最大D-1个元素之和小于N。
接下来只好翻译一下题解。。。
因为最终的结果a肯定是一个非递减数列,考虑最后d-1个元素之和,设为S,这个S一定不能超过N,因为超过的话,那么选取这N个元素,种类就小于D了。然后还希望最终结果最大,所以S必为N-1。
假设最后d-1个元素为X,之后的我们再分配,那么最后d-1个元素还有N-1-(d-1)*X没有分配,这些为了取最大值,分给A这个元素上了。
之后,同样的,为了取最大值,a又是一个非递减数列,所以X一直赋值过去,赋到取不到为止,数量为B个,然后把剩下的给A-B-1。
最终,枚举X,取最大值。
代码:
题意是1到A,A种物品,第i种物品价值为i,你要买L件,要求满足的条件是,买的L件物品中,任意挑选N件,其种类至少要有D种。问物品的总价值最大是多少。
做的时候很懵。。。贪了一下,只过了样例。
经过鸟神的翻译之后,题意可以简化如下对于1<=i<=A,要构造一个数组,使得sum a[i] = L,然后b是a排好序之后,b的最大D-1个元素之和小于N。
接下来只好翻译一下题解。。。
因为最终的结果a肯定是一个非递减数列,考虑最后d-1个元素之和,设为S,这个S一定不能超过N,因为超过的话,那么选取这N个元素,种类就小于D了。然后还希望最终结果最大,所以S必为N-1。
假设最后d-1个元素为X,之后的我们再分配,那么最后d-1个元素还有N-1-(d-1)*X没有分配,这些为了取最大值,分给A这个元素上了。
之后,同样的,为了取最大值,a又是一个非递减数列,所以X一直赋值过去,赋到取不到为止,数量为B个,然后把剩下的给A-B-1。
E = N - 1 - X*(D - 1); M = L - X - E; B = M / X;
最终,枚举X,取最大值。
代码:
//#pragma comment(linker, "/STACK:102400000,102400000") #pragma warning(disable:4996) #include <fstream> #include <iostream> #include <functional> #include <algorithm> #include <cstring> #include <vector> #include <string> #include <cstdio> #include <cmath> #include <queue> #include <stack> #include <deque> #include <ctime> #include <list> #include <set> #include <map> using namespace std; typedef long long ll; #define eps 1e-10 #define LL_INF 0x3fffffffffffffff #define INF 0x3f3f3f3f #define mem(a, b) memset(a, b, sizeof(a)) #define pper(i,n,m) for(int i = n;i >= m; i--) #define repp(i, n, m) for (int i = n; i <= m; i++) #define rep(i, n, m) for (int i = n; i < m; i++) #define sa(n) scanf("%d", &(n)) #define mp make_pair #define ff first #define ss second #define pb push_back const int maxn = 205; const ll mod = 23333333; const double PI = acos(-1.0); ll L, A, N, D; void solve() { scanf("%lld%lld%lld%lld", &L, &A, &N, &D); if (A < D) { puts("SAD"); return; } ll res = 0; ll X, M, B, E, Y; for (X = 1; X <= L; X++) { ll r = 0; E = N - 1 - X*(D - 1); if (E < 0) break; r += (X + E)*A; M = L - X - E; if (M < 0) { continue; } B = M / X; r += X*(2 * A - B - 1)*B / 2; Y = M - B*X; if (A - B - 1 < 0) { continue; } if (A - B - 1 == 0 && Y) { continue; } r += (A - B - 1)*Y; res = max(res, r); } if (res == 0) { puts("SAD"); } else { printf("%lld\n", res); } } int main() { int t; sa(t); while (t--) { solve(); } return 0; }
相关文章推荐
- ThreadLocal
- 修改input标签type=file类型的文字
- 详解Swift中的数据类型类型转换
- 威佐夫博弈
- C#任意变换图像大小
- 颜色渐变、#16进制转RGB颜色(转Int)
- iOS SDWebImage 淡入 UITableViewCell
- C++中ANSI、Unicode、UTF8字符串之间的互转
- 支持向量机(五)SMO算法
- Android异常解决--A WebView method was called on thread 'JavaBridge'. All WebView methods must be called
- KVM 虚拟化架构和实现原理
- 异常篇之Activity class {} does not exist(AS)
- UIButton 的图文混排
- linux 快速分析JVM信息
- 浅谈Android开发中内存泄露与优化-------其一
- Ubuntu下github pages+hexo搭建自己的博客
- Objective-C——Block的使用
- session详解
- Ubuntu下github pages+hexo搭建自己的博客
- 项目经验(持续更新)