2018-BNUZ-ACM-GDCPC选拔赛 CodeForces 812C【补】

原创 2018年04月16日 16:43:16
C. Sagheer and Nubian Market
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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 kitems 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 kT — the maximum number of souvenirs Sagheer can buy and the minimum total cost to buy these ksouvenirs.

Examples
input
Copy
3 11
2 3 5
output
Copy
2 11
input
Copy
4 100
1 2 5 6
output
Copy
4 54
input
Copy
1 7
7
output
Copy
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.

题意:有个奇怪的商店,其中的有n个物品,基础为价格ai,预算为s, 每个商品的价格是会实时变动的, price[i] = a[i] + i * k 【k为所选物品的数量】, 求 花最少的钱 买 最多的物品 。 输出 k 和 总花费

题解:对k进行二分,将 算好价格的数组排序(这里我用了优先队列)后 算出 总价格 , 判断总价格 小于 预算s 就好了

AC代码:

#include <bits/stdc++.h>
#define ll long long

using namespace std;

int main() {
	ll n, s, a[100010];
	cin >> n >> s;
	for (ll i = 1; i <= n; i++) {
		scanf("%lld", &a[i]);
	}
	ll r = n, l = 1, mid, sum, ans1 = 0, ans2 = 0;
	while (l <= r) {
		mid = (l + r) >> 1;
//cout << mid << "--" << endl;
		priority_queue<ll, vector<ll>, greater<ll> > q;
		for (int i = 1; i <= n; i++) {
			q.push(a[i] + i*mid);
		}
		sum = 0;
		for (int i = 1; i <= mid; i++) {
			sum += q.top();
			q.pop();
		}
//cout <<"sum=" << sum << endl;
		if (sum > s) {
			r = mid - 1;
		} else {
			l = mid + 1;
			ans1 = mid;
			ans2 = sum;
		}
//cout << "ans1=" << ans1 << " ans2=" << ans2 << endl;
	}
	cout << ans1 << " " << ans2 << endl;
}
--------------------------------------------------------------------------------------------------------------------------------------
后记。。
被小Q吐槽说 这种排序方式不太健康,浪费内存, 还有二分最好写成封装。
附上小Q的代码:

#include <bits/stdc++.h>

#define MAXN 100005
#define ll long long
#define pll pair<ll, ll>

using namespace std;

ll a[MAXN];
pll b[MAXN];
ll n;
ll s;

ll getval(ll p) {
    for (ll i = 1; i <= n; i++) {
        b[i].second = i;
        b[i].first = p * i + a[i];
    }
    sort(b + 1, b + n + 1);
    ll ans = 0;
    for (ll i = 1; i <= p; i++) {
        ans += b[i].first;
    }
    return ans;
}

ll binary_search(ll l, ll r) {
    ll mid = l + r >> 1;
    ll ans = mid;
    while (l <= r) {
        mid = l + r >> 1;
        if (s >= getval(mid)) {
            ans = mid;
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    return ans;
}

int main() {
    cin >> n >> s;
    for (ll i = 1; i <= n; i++) {
        scanf("%lld", &a[i]);
    }
    ll p = binary_search(0, n);
    printf("%lld %lld\n", p, getval(p));
}

2018-BNUZ-ACM-GDCPC选拔赛 CodeForces 812B【补】

B. Sagheer, the Hausmeistertime limit per test 1 secondmemory limit per test 256 megabytesinput stan...
  • qq_40731186
  • qq_40731186
  • 2018-04-16 22:28:43
  • 9

2018-BNUZ-ACM-GDCPC选拔赛 CodeForces 766A【补】

A. Mahmoud and Longest Uncommon Subsequencetime limit per test2 secondsmemory limit per test256 mega...
  • qq_40731186
  • qq_40731186
  • 2018-04-16 12:45:40
  • 12

2018-BNUZ-ACM-GDCPC选拔赛 CodeForces 766B【补】

B. Mahmoud and a Triangletime limit per test2 secondsmemory limit per test256 megabytesinputstandard...
  • qq_40731186
  • qq_40731186
  • 2018-04-16 12:31:56
  • 1

codeforces 812 C. Sagheer and Nubian Market(二分答案)

题意: n个商品,有s块钱,买第i件商品的价格为a[i]+i*k,a[i]为商品的基础价格,k为总共要买的商品数量,问最多能买多少件商品,在买相同数量的商品情况下,尽量让花的钱最少。 解题思路: ...
  • johsnows
  • johsnows
  • 2017-06-02 17:20:35
  • 295

Codeforces 812C Sagheer and Nubian Market【二分】水题

C. Sagheer and Nubian Market time limit per test 2 seconds memory limit per test 256 megabyt...
  • mengxiang000000
  • mengxiang000000
  • 2017-06-02 14:05:19
  • 245

Codeforces 812C Sagheer and Nubian Market[二分]

题意:给了n个物品,每个物品的价值为ai,你可以选取其中的k个,代价是k个ai的和加上他们的下标乘k的和。 问,在给定最大代价S的条件下,最多能取几个,取的最多的情况下,代价是多少。 分析...
  • Chyllo
  • Chyllo
  • 2017-06-02 13:06:46
  • 344

2018-BNUZ-ACM-GDCPC选拔赛 【补题】

第一次GDCPC选拔,说不想去是不可能的,中午回来就赶紧休息,下午又早早的来到教室,可是还是自己的问题吧,又是卡题,就是一点思路都没有,就想着暴力,结果过不去各种wa还有tle,第一次出校打比赛的机会...
  • YIOWOIY
  • YIOWOIY
  • 2018-04-16 00:58:10
  • 7

CodeForces - 812C (14/600)

On his trip to Luxor and Aswan, Sagheer went to a Nubian market to buy some souvenirs for his friend...
  • NineFailure
  • NineFailure
  • 2017-06-12 12:49:37
  • 132

2018-BNUZ-ACM-GDCPC选拔赛(耻辱赛)E 【补题】

B. Mahmoud and a Triangletime limit per test 2 secondsmemory limit per test 256 megabytesinput stand...
  • bnuz_kuye
  • bnuz_kuye
  • 2018-04-15 21:52:39
  • 14

2018-BNUZ-ACM-GDCPC选拔赛(耻辱赛)D 【补题】

A. Mahmoud and Longest Uncommon Subsequencetime limit per test2 secondsmemory limit per test256 mega...
  • bnuz_kuye
  • bnuz_kuye
  • 2018-04-15 22:10:41
  • 4
收藏助手
不良信息举报
您举报文章:2018-BNUZ-ACM-GDCPC选拔赛 CodeForces 812C【补】
举报原因:
原因补充:

(最多只允许输入30个字)