#417 Div2 Problem C Sagheer and Nubian Market (二分 && std::accumulate)
题目链接 : http://codeforces.com/problemset/problem/812/C
题意 : 给你 n 件物品和你拥有的钱 S, 接下来给出这 n 件物品的价格, 这些物品的价值不是固定不变的, 价格的变化公式是 a[i]+k*i (i代表第 i 件物品, k 代表你选择买的物品数量, a[i]为物品的底价), 现问你最多能够买多少件物品和所买物品总和, 输出时应该使得所买物品总和尽量小
分析 : 如果我当前能买 k 件物品, 那我肯定能买数量小于 k 的物品, 如果我当前买不起 k 件物品, 那我肯定也不能买比 k 件要多的物品。所以可以考虑二分解法, 在1~n之间二分查找 k, 这里需要注意的是, 在二分的过程中应该需要对当前的价格进行更新和排序, 才能保证最后输出的物品总和尽量小!
技巧 : 这里有需要计算数组前 k 个的和, 可以考虑使用 std::accumulate(begin, end, base), 代表从数组的arr[begin]加到arr[end]的和再加上base, 也就是在base的基础上求arr数组的begin~end的和, 这里有详细介绍(值得一提的是复杂度是 O(n) ) http://classfoo.com/ccby/article/Y749fK
std::accumulate函数应用举例 :
#include <vector> #include <numeric> #include <functional> #include <iostream> using namespace std; int main( ) { vector < ); vector <int>::iterator Iter1, Iter2; int i; ; i < ; i++ ) { v1.push_back( i ); } cout << "最初向量v1中个元素的值为:\n ( " ; for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ ) cout << *Iter1 << " "; cout << ")." << endl; // accumulate函数的第一个功能,求和 int total; total = accumulate ( v1.begin ( ) , v1.end ( ) , ); cout << "整数从1到20的和为: " << total << "." << endl; // 构造一个前n项和的向量 , partotal; ; Iter1 != v1.end( ) + ; Iter1++ ) { partotal = accumulate ( v1.begin ( ) , Iter1 , ); v2 [ j ] = partotal; j++; } cout << "前n项和分别为:\n ( " ; for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ ) cout << *Iter2 << " "; cout << ")." << endl << endl; // accumulate函数的第二个功能,计算连乘积 vector < ); vector <int>::iterator Iter3, Iter4; int s; ; s < ; s++ ) { v3.push_back( s ); } cout << "向量v3的初始值分别为:\n ( " ; for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ ) cout << *Iter3 << " "; cout << ")." << endl; int ptotal; ptotal = accumulate ( v3.begin ( ) , v3.end ( ) , , multiplies<int>( ) ); cout << "整数1到10的连乘积为: " << ptotal << "." << endl; // 构造一个前n项积的向量 , ppartotal; ; Iter3 != v3.end( ) + ; Iter3++ ) { ppartotal = accumulate ( v3.begin ( ) , Iter3 , , multiplies<int>( ) ); v4 [ k ] = ppartotal; k++; } cout << "前n项积分别为:\n ( " ; for ( Iter4 = v4.begin( ) ; Iter4 != v4.end( ) ; Iter4++ ) cout << *Iter4 << " "; cout << ")." << endl; }
瞎想 : 一开始是在想是否能用背包做, 事实证明在S那个数据量下是不可能的, 而且背包的话, 这里要求的是总和尽量小。
#include<bits/stdc++.h> #define LL long long using namespace std; ; LL arr[maxn], change[maxn]; LL n, s; LL cal(LL k) { ; i<=n; i++) change[i] = i*k+arr[i]; sort(change+, change++n); LL ans = accumulate(change+, change++k, 0LL); return ans; } int main(void) { scanf("%lld %lld", &n, &s); ; i<=n; i++) scanf("%lld", &arr[i]); LL L = , R = n, mid; while(L<=R){ mid = L + ((R-L)>>); LL sum = cal(mid); ; ; } ){ puts("0 0"); ; } L--; printf("%lld %lld\n", L, cal(L)); ; }
#417 Div2 Problem C Sagheer and Nubian Market (二分 && std::accumulate)的更多相关文章
- CodeForce-812C Sagheer and Nubian Market(二分)
Sagheer and Nubian Market CodeForces - 812C 题意:n个货物,每个货物基础价格是ai. 当你一共购买k个货物时,每个货物的价格为a[i]+k*i. 每个货物只 ...
- Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- CodeForces - 812C Sagheer and Nubian Market 二分
On his trip to Luxor and Aswan, Sagheer went to a Nubian market to buy some souvenirs for his friend ...
- #417 Div2 Problem B Sagheer, the Hausmeister (DFS && 枚举)
题目链接:http://codeforces.com/contest/812/problem/B 题意 : 给出一个 n (1 ≤ n ≤ 15)层的教学楼, 每一层楼包含 m (1 ≤ m ≤ 10 ...
- 【二分】Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market
傻逼二分 #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll ...
- CF812C Sagheer and Nubian Market 二分+贪心
模拟赛给他们出T1好了~ code: #include <bits/stdc++.h> #define ll long long #define N 100006 #define setI ...
- Codeforces Round #417 C. Sagheer and Nubian Market
C. Sagheer and Nubian Market time limit per test 2 seconds memory limit per test 256 megabytes O ...
- Codeforces812C Sagheer and Nubian Market 2017-06-02 20:39 153人阅读 评论(0) 收藏
C. Sagheer and Nubian Market time limit per test 2 seconds memory limit per test 256 megabytes input ...
- AC日记——Sagheer and Nubian Market codeforces 812c
C - Sagheer and Nubian Market 思路: 二分: 代码: #include <bits/stdc++.h> using namespace std; #defin ...
随机推荐
- 【VS开发】【图像处理】基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果
基于灰度世界.完美反射.动态阈值等图像自动白平衡算法的原理.实现及效果 白平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题.白平衡是随着电子影像再现色彩真实 ...
- [Python3] 029 常用模块 timeit
目录 timeit 直接举例 1. 测量生成列表的时间 2. 测量函数运行时间(一) 3. 测量函数运行时间(二) timeit 直接举例 必要的导入 import timeit 1. 测量生成列表的 ...
- 【7.9校内test】T2 极值问题
这个题真的,毫无思路的说,但是我们会打表啊: lz的打表之路: 当然是手写一个暴力啦(*^▽^*)! 然后滚去配置lemon测试一下暴力可以得多少分qwq: 是的40分呢! 然后其实看上面也能看出来一 ...
- C++:string操作函数
要想使用标准C++中string类,必须要包含 #include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 ...
- poj 1061 青蛙的约会+拓展欧几里得+题解
青蛙的约会+拓展欧几里得+题解 纵有疾风起 题意 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出 ...
- spring boot 是如何利用jackson进行序列化的?
接上一篇:spring boot 是如何利用jackson进行反序列化的? @RestController public class HelloController { @RequestMapping ...
- 34、Scrapy 知识总结
Scrapy 知识总结 1.安装 pip install wheel pip install https://download.lfd.uci.edu/pythonlibs/q5gtlas ...
- qt在tableview中绘制图片
void ItemModelDeletage::paint(QPainter *painter, const QStyleOptionViewItem &option, const QMode ...
- vue学习【四】vuex快速入门
大家好,我是一叶,今天我们继续踩坑.今天的内容是vuex快速入门,页面传值不多的话,不建议vuex,直接props进行父子间传值就行,使用vuex就显得比较臃肿. 我们先预览一下效果,如图1所示. 图 ...
- 【vue】canvas验证码组件--数字/数字加字母
基于canvas的数字/数字+字符验证码 SIdentify.vue 组件 <!-- 基于canvas的数字/数字+字符验证码 --> <!-- 调用格式 <s-ident ...