codeforces 812C Sagheer and Nubian Market (二分)

来源:互联网 发布:mysql派生表查询 编辑:程序博客网 时间:2024/06/05 13:33

codeforces 812C Sagheer and Nubian Marke

On his trip to Luxor and Aswan, Sagheer went to a Nubian market to buy some souvenirs for his friends and relatives. The market has some strange rules. It contains n different items numbered from 1 to n. The i-th item has base cost ai Egyptian pounds. If Sagheer buys k items with indices x1, x2, ..., xk, then the cost of item xj is axj + xj·k for 1 ≤ j ≤ k. In other words, the cost of an item is equal to its base cost in addition to its index multiplied by the factor k.
Sagheer wants to buy as many souvenirs as possible without paying more than S Egyptian pounds. Note that he cannot buy a souvenir more than once. If there are many ways to maximize the number of souvenirs, he will choose the way that will minimize the total cost. Can you help him with this task?
Input
The first line contains two integers n and S (1 ≤ n ≤ 105 and 1 ≤ S ≤ 109) — the number of souvenirs in the market and Sagheer's budget.
The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 105) — the base costs of the souvenirs.
Output
On a single line, print two integers k, T — the maximum number of souvenirs Sagheer can buy and the minimum total cost to buy these k souvenirs.
Example
Input
3 11
2 3 5
Output
2 11
Input
4 100
1 2 5 6
Output
4 54
Input
1 7
7
Output
0 0
Note
In the first example, he cannot take the three items because they will cost him [5, 9, 14] with total cost 28. If he decides to take only two items, then the costs will be [4, 7, 11]. So he can afford the first and second items.
In the second example, he can buy all items as they will cost him [5, 10, 17, 22].
In the third example, there is only one souvenir in the market which will cost him 8 pounds, so he cannot buy it.

  题意:一个人有预算S,买k钟商品,一个商店有n钟商品,每种商品只有一件,每件商品的花费为这件这件商品本身的价格加上k乘以他的下标,求这个人能买得最多商品件数以及最小花费
  思路:二分这个人买的商品数k,每次重新求每件商品的花费,然后排序,求出总花费,比较与预算的大小关系
  还是做的题少啊,根本没往二分上想
   
#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>#include <math.h> #include <string>#include <vector>#include <queue> #include <stack> #include <set>#include <map>using namespace std;typedef long long ll;ll a[100005];ll b[100005];int main(void){int n,S;scanf("%d%lld",&n,&S);for(int i=1;i<=n;i++)    scanf("%lld",&a[i]);ll l=1,r=n,ans=0,sum1=0,mid;while(l<=r){mid=(l+r)>>1;for(int i=1;i<=n;i++)    b[i]=a[i]+i*mid;sort(b+1,b+1+n);ll sum=0;   for(int i=1;i<=mid;i++)      sum+=b[i];if(S>=sum) { sum1=sum;ans=mid;l=mid+1;}else r=mid-1;    }    printf("%lld %lld\n",ans,sum1);return 0; }

原创粉丝点击