相交平行线


私信TA

用户名:uq_28584700180

访问量:383

签 名:

等  级
排  名 59826
经  验 193
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:
 如何选择购买是与顺序无关的,我们发现,排序后,如果选择购买的商品价格高,那么可以选价格相对更高的商品报销,这样就可以降低成本 。排序后,贪心的从后往前购买商品,当购买的商品数量达到2时,就可以选择一个商品报销,毫无疑问我们需要在能报销的范围内找最大报销,也就是在0~a[i]/2下取整范围中找。如果我们按循环一个一个去找那么时间复杂度会达到o(n^2),会超时,这个方法不可取。注意到我们事先进行了排序,那么就可以二分查找的方式找到最大的<=a[i]/2的值,记录报销此产品,最后统计答案时忽略该值。
注意事项:
当我们二分出一个可以报销的价格时,我们标记改值,次商品不用再购买也不能再报销,我们可以发现,这个商品的后面的商品是都不能在继续买商品报销的,因为这个临界点是我们二分出来的,此时把下一次二分右端点往左移一位,为下一次二分出临界点做前置条件。
参考代码:

import java.util.*;

import java.io.*;

public class Main {

static int[] dx = {0,1,-1,0};

static int[] dy = {1,0,0,-1};

static long qmi(long a,long k,long mod)

{

long res = 1;

while(k>0)

{

if(k%2==1) res = (res*a)%mod;

k >>= 1;

a = (a*a)%mod;

}

return res;

}



public static void main(String[] args) {

 InputReader in = new InputReader(System.in);

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));

   

    int n = in.nextInt();

    int[] a = new int[n];

    for(int i = 0; i < n;i ++)

    a[i] = in.nextInt();

    long res = 0;

    boolean[] v = new boolean[n];

    int f = 0;

    Arrays.sort(a);

    int k = n-1;

    for(int i = n-1;i >= 0;i --)

    {

    if(v[i]) continue;

    f ++;

    if(f == 2)

    {

    int l = 0;int r = k;

    while(l < r)

    {

    int mid = l+r+1>>1;

    if(a[mid]*2<=a[i])

    l = mid;

    else r = mid-1;

    }

    if(a[l]*2<=a[i])

    {

    v[l] = true;//二分出的点可以报销,标记此点不需要统计答案;

    k = l-1;//二分临界端点左移

    }

    f = 0;

    }

   

   

    }

    for(int i = 0;i < n;i ++) if(!v[i]) res += a[i];//统计没有标记的答案,被标记过的都是报销价格的。

    out.println(res);

       

       

       

       

out.flush();

}

}



class InputReader {

    private final BufferedReader buf;

    private StringTokenizer tkl;


    public InputReader(InputStream is) {

        buf = new BufferedReader(new InputStreamReader(is));

    }


    public boolean hasNext() {

        try {

            while (tkl == null || !tkl.hasMoreElements()) tkl = new StringTokenizer(buf.readLine());

        } catch (Exception e) {

            return false;

        }

        return true;

    }


    public String next() {

        return hasNext() ? tkl.nextToken() : null;

    }


    public int nextInt() {

        return Integer.parseInt(next());

    }


    public double nextDouble() {

        return Double.parseDouble(next());

    }


    public long nextLong() {

        return Long.parseLong(next());

    }

}


 

0.0分

1 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答

代码解释器

  评论区