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[i]=a[i]+1ll*tmp*i;
    sort(A+1,A+1+n);
    ll pp=0;
    for(i=1;i<=n;++i)
    {
        if(pp+A[i]>S) break;
        else
        {
            pp+=A[i];
            ++cnt;
            if(cnt==tmp) break;
        }
    }
    if(cnt>=tmp)
    {
        ck=pp;
        return 1;
    }
    return 0;
}
int main()
{
    int i,j;
    // setIO("input");
    scanf("%d%lld",&n,&S);
    for(i=1;i<=n;++i) scanf("%lld",&a[i]);
    int l=1,r=n,mid,ans=0;
    for(;l<=r;)
    {
        mid=(l+r)>>1;
        if(check(mid)) ans=mid,l=mid+1;
        else r=mid-1;
    }
    printf("%d %lld\n",ans,ck);
    return 0;
}

  

原文地址:https://www.cnblogs.com/guangheli/p/11620020.html

时间: 2024-08-09 16:48:07

CF812C 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 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之间二分查找

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) 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&

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

二分+贪心

上海邀请赛热身时候,C题是一个二分+贪心的题目.起初并不会,问了旁边的复旦大神.这几天无意发现VJ上一个专题.擦原来是一个经典类型. 二分+贪心 这类题目注意数据范围,1e8,1e9一般都是这样. 注意事项 二分法有很多写法,推荐用lf+1 < rf的写法.这个也符合计算机中数据存取的原则.对于浮点数,直接就循环100次,精度绝对够. 一般有两种类型,一种是询问最优,即数列中无重复.一种是多个即lower_bound ,upper_bound这类函数问题. 贪心使用,就是这个问题枚举答案可被验证

nyoj586||poj2456 二分+贪心

完全看不懂题意....百度搜搜才看懂题意  然后就参考代码了 和yougth的最大化()nyoj914差不多的方法 二分+贪心 #include <stdio.h> #include <algorithm> using namespace std; int c,a[100005],n; bool judge(int k) { int p=a[0],cnt=1;//也就这里注意点 从1开始 自己想想为啥 for(int i=1;i<n;i++) { if(a[i]-p>=

HDU 4004 The Frog&#39;s Games 二分 贪心

戳这里:HDU 4004 //思路:二分经典入门题...贪心判方案是否可行 1 #include "bits/stdc++.h" 2 using namespace std; 3 int L, n, m; 4 int pos[500010], dis[500010]; 5 6 bool Cant(int Dis_Jump) 7 { 8 int i, Dis_Sum = 0, Count = 0; 9 for(i = 1; i <= n + 1; ++i) { 10 if(dis[