蓝桥杯练习——七夕礼物c语言版

题目描述

七夕节要到了,小明决定给暗恋已久的女神小花送一份大礼。

已知蓝桥商店有 nn 个玩偶,第 ii 个玩偶能给人带来 a_iai 的好感值。

通过打听,小明得知了七夕节当天女神小花的心情值为 tt,于是小明决定,从商店购买任意个玩偶使得这些玩偶能带来的好感值和女神小花的心情值最接近。

请你输出这最小的 |心情值-好感值| 。

输入描述

第一行包含两个整数 n,tn,t,其含义如题所述。

接下来一行包含 nn 个整数,分别表示 a_1,a_2,\cdots,a_na1,a2,⋯,an

1\leq N \leq 10^51≤N≤105,|a_i|\leq 10^4∣ai∣≤104,0\leq t\leq 10^90≤t≤109。

输出描述

输出共一行,包含一个整数,表示答案。

输入输出样例

输入

5 11
1 2 3 4 5

输出

1

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 128M

//首先连续就想到前缀和,然后分析得对前缀和数组进行尺取法
//其实还有不用尺取法,比如哈希表优化
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void*_a, const void*_b);//排序函数原型
int main(int argc, char *argv[])
{
    long long t, i, n, pre[100000] = { 0 }, right, left,min;
    int k=0,j=0;
    long long a[100000];
    scanf("%lld %lld", &n, &t);
    for (i = 0; i < n; i++)
        scanf("%lld", &a[i]);
  pre[0]=a[0];
    for (i = 1; i <n; i++)
        pre[i] = a[i] + pre[i - 1];
        qsort(pre, n, sizeof(pre[0]), cmp_int);//如果用qsor()函数只能从0开始
  min=t;
    for (i = left = 0, right = 1; right <n; right++)
    {
        k = 0;
        while (pre[right] - pre[left] > t)//左端点动的条件,称为临界情况
        {left++; k = 1;j=1;}
        if (pre[right] - pre[left] == t)//注意放在后面,因为left会变
        {min = 0;break;}
        if ((t - pre[right] + pre[left] > pre[right] - pre[left - 1] - t) && k == 1)
        {//当右端点刚好跨过时,并且省略了fabs()函数
            if (pre[right] - pre[left - 1] - t<min) 
      min = pre[right] - pre[left - 1] - t;//因为有多个临界情况,所以要比较
        }
    else if(t - pre[right] + pre[left]<min) min=t - pre[right] + pre[left];//同上
    }if(j==0&&right==n-1){//当没有临界情况,就是都小于t。并且“不是因为break”!
      if(pre[0]>0) min=t-pre[n-1];//当第一个是正数,就是全部都买
  else min=t-pre[n-1]+pre[0];}
    printf("%lld", min);
    return 0;
}
int cmp_int(const void*_a, const void*_b)
{
    int*a = (int*)_a; int*b=(int*)_b;
    return *a - *b;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y1yEar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值