zoukankan      html  css  js  c++  java
  • Minimizing Difference 【思维】

    题目链接:

    https://vjudge.net/contest/336389#problem/B

    题目大意:

    给出一个长度为n的数列以及操作次数k。k的范围为1e14。每次操作都可以选择给任意一个数加1或者减1。问k次操作后,数列中最大值与最小值的差值最小是多少。

    解题思路:

    1.可以用二分

    2.思维,对数组进行排序,同时计算前后两个方向。具体看代码:

     1 #include<stdio.h>
     2 #include<algorithm>
     3 typedef long long ll;
     4 const int MAXN = 1e5 + 100;
     5 using namespace std;
     6 
     7 ll a[MAXN];
     8 ll n, k, temp, ans;
     9 
    10 int main()
    11 {
    12     scanf("%lld%lld", &n, &k);
    13     for(int i = 1; i <= n; i ++)
    14         scanf("%lld", &a[i]);
    15     sort(a + 1, a + 1 + n);
    16     for(int i = 1; i <= n / 2; i ++)
    17     {
    18         int j = n - i + 1;
    19         temp = (a[i + 1] - a[i] + a[j] - a[j - 1]) * i; //将前i个都变成a[i + 1]以及将后i个全变成a[j]所需要的操作次数 
    20         if(temp <= k)
    21             k -= temp;
    22         else
    23         {
    24             ans = a[j] - a[i] - k / i; //剩余操作次数可否使某一边都作贡献 
    25             break;
    26         }
    27     }
    28     printf("%lld
    ", ans);
    29     return 0;
    30 }
    View Code
  • 相关阅读:
    关于我的介绍
    关于这周的作业
    关于这周的学习
    每周学习
    关于这周程序设计
    关于这周的总结
    关于这周的学习
    随机抽签程序报告
    Mysql的主从复制原理及部署
    项目架构脚本
  • 原文地址:https://www.cnblogs.com/yuanweidao/p/11709157.html
Copyright © 2011-2022 走看看