Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market

来源:互联网 发布:龙发装修 知乎 编辑:程序博客网 时间:2024/05/17 23:47

看了别人的题解,看懂题目了,说是二分,然后就二分做,结果就是超时了。我枚举了k,对每个k,二分求的花费这里写图片描述
看了看cf题解,说是二分k,然后又二分,边界问题处理了好久。。平时二分做的少,碰到二分的时候,处理边界就是个大问题了。。要练练二分了。。

#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int MAXN = 500010;ll a[MAXN];ll temp[MAXN];ll n,s;int main(){    cin >> n >> s;    for(int i = 1; i <= n; ++i)        cin >> a[i];    ll l = 1;    ll r = n;    ll sum = 0;    while(l <= r)    {        ll mid = (l+r)>>1;        for(int i = 1; i <= n; ++i)            temp[i] = a[i]+i*mid;        sort(temp+1,temp+1+n);        sum = 0;        for(int i = 1; i <= mid; ++i)            sum += temp[i];        if(sum > s)            r = mid-1;        else            l = mid+1;    }    sum = 0;    for(int i = 1; i <= n; ++i)        temp[i] = a[i]+i*(l-1);    sort(temp+1,temp+1+n);    for(int i = 1; i < l; ++i)        sum += temp[i];    cout << l-1 << " " << sum << endl;    return 0;}
原创粉丝点击