#417(div2) C. Sagheer and Nubian Market

题意:给出n件商品价格和一个最大限额S,购买时商品的价格变为axj?+?xj·k,xj是下标索引,k是购买数量,求最多能买几件和花费。

思路:二分+排序

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4
 5 ll a[100005];
 6 ll b[100005];
 7 ll n,s;
 8 ll sum;
 9 ll check(ll x){
10    sum=0;
11     for(int i=1;i<=n;i++)
12         b[i]=a[i]+i*x;
13     sort(b+1,b+1+n);
14     for(int i=1;i<=x;i++) sum+=b[i];
15     return sum;
16  }
17 int main(){
18     ll ssum=0;
19     ll x;
20     scanf("%I64d%I64d",&n,&s);
21     for(int i=1;i<=n;i++) {
22             scanf("%I64d",&a[i]);
23     }
24     ll l=1,r=n,mid,ans=0;
25     while(l<=r){
26         mid=(l+r)>>1;
27         if(check(mid)<=s){
28             l=mid+1,ans=mid;
29             ssum=sum;
30
31         }
32         else r=mid-1;
33     }
34     cout<<ans<<" "<<ssum<<endl;
35 }
时间: 2024-11-06 03:33:42

#417(div2) C. Sagheer and Nubian Market的相关文章

Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market 二分答案 +排序

Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market 二分答案 +排序 题意 有 a[ i ] 个数 要求选最多的数 使其和不超过 S ,且在此情况下,和最小选最多数情况下 和最小 且 每个数有加成 如果选了 k个数 那么加成后 就是 a[ i ] + k*i ; 题解 二分mid 表示选了个数 加成一下,将加成以后结果排序一下 , 若前 mid数 和大于 s 则此方案不可行 PS 要用 long long ..... 还有 co

#417(div2) B - Sagheer, the Hausmeister

题意:输入n,m,代表n层楼,每层有m个房间,左右都有2个楼梯且为0,我们最开始在左下,如果当前楼层没1,那么可以直接向上走,也可以走过去然后走回来,也可以一直走,但向上只能在最左或者最右,问把所有1变成0,要多久,移动一个花费1. 思路:我们可以记录每一层最左边和最右边的1在哪个位置,当前在左边楼梯判断是走到最右边短,还是走到最右边那个1+往回走短:当前在右边楼梯同理.最上面一层需特别处理,我只要走到最后一个1那里就行,没必要走到楼梯那里,还有最上面几层没1 1 #include<bits/s

#417(div2) A. Sagheer and Crossroads

题意:4个路口,左拐,向前,右拐,行人的四种状态,1代表绿灯,0代表红灯,也就是1车可以走,人也可以走,发生事故输出YES,否则NO. 思路:瞎搞 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 int l[5],s[5],r[5],p[5]; 6 for(int i=1;i<=4;i++){ 7 scanf("%d%d%d%d",&l[i],&s[i],&r

812C - Sagheer and Nubian Market

Sagheer and Nubian Market 二分+排序 比赛时没对,赛后检查才发现check()里的参数类型是int 改成ll就对了.好气哦! 1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N = 1e5+10; 5 ll a[N], b[N], k, t, n, l, r, s, ans; 6 7 bool check(ll x ){ 8 for(int i =

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

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

#417 Div2 Problem C Sagheer and Nubian Market (二分 &amp;&amp; std::accumulate)

题意 : 给你 n 件物品和你拥有的钱 S, 接下来给出这 n 件物品的价格, 这些物品的价值不是固定不变的, 价格的变化公式是 a[i]+k*i (i代表第 i 件物品, k 代表你选择买的物品数量, a[i]为物品的底价), 现问你最多能够买多少件物品和所买物品总和, 输出时应该使得所买物品总和尽量小 分析 : 如果我当前能买 k 件物品, 那我肯定能买数量小于 k 的物品, 如果我当前买不起 k 件物品, 那我肯定也不能买比 k 件要多的物品.所以可以考虑二分解法, 在1~n之间二分查找

CF812C Sagheer and Nubian Market 二分+贪心

模拟赛给他们出T1好了~ code: #include <bits/stdc++.h> #define ll long long #define N 100006 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n; ll a[N],ck,A[N],S; int check(int tmp) { int i,cnt=0; for(i=1;i<=n;++i) A[

codefoces812C-Sagheer and Nubian Market心得

题目描述: 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

cf386(div2)大一狗ACM之路

#cf386(div2)总结#前两题很顺利的做了出来, c题扔了, D题wrong了5发才A掉.A题签到题, 但是想多了, 代码写的有点长了. 找被整除最小值*7.B题 读题读了一会, 读完了就有思路了, 1A. 字符串问题, 从后往前两个两个的放到新的字符串里, 一个从最左, 一个从最右, 模拟指针扫着放, 最后特判会不会扫到一起.C题跳了没看, 最后做完了D题回来看了一眼没什么思路 日后再说.D题, 恩.. 两个多小时都用在这题上面了, 20分钟的时候做完了B之后就一直再啃D题, 暴力判断啊