2020年广东工业大学第十届文远知行杯新生程序设计竞赛(同步赛)G- 排解忧伤

原题链接:

https://ac.nowcoder.com/acm/contest/9692

题意:

  • 这题就是说有m个嘉宾抢最多n个座位,抢不到心仪的座位就只能继续往前走,还得生气,怒气值就是这位嘉宾多走了几个座位。

题解:

  1. 要尽量让怒气值最小,也就是走过的距离最小,那肯定得啪的一下看到心仪座位后的空的座位嘉宾就马上坐下。
  2. 那么我们假设有无数个座位供嘉宾们坐下,记最后一个嘉宾坐下的位置为p,若p > n就说明座位不够,输出-1,否则输出怒气值的和。

实现:

  1. 先让这m个嘉宾的心仪座位(假设有四个)从小到大排序,分别记为m1,m2,m3,m4。座位靠前的先进去,啪的一下就坐下来了并且马上占据了这个座位,那很显然p的长度马上就变成了m1,并且下一个人至少从第p+1(或者说m1+1)个座位开始坐下。
  2. 如果m2 < p+1,m2嘉宾只能生[(p+1) - m2](当然此处是一)格的气并且坐下,此时p又得加一,下一个人最少只能坐p+2了。
  3. 如果m2 >= p+1,那m2嘉宾就可以坐到自己心仪的位置上了。如果这个时候最后一个座位p已经变成了m2,下一个人又只能坐p++(或者说m2++也行)了。
  4. 还记得我们对m排序了吗,也就说明一定有m3 >= m2,那我们就又可以重复刚刚的行为了耶!!
  5. 最后我们的m4嘉宾坐下来了,此时的p就是我们需要的座位个数。

代码:

#include <bits/stdc++.h>
//
using namespace std;
const int mod = 1e9+7;
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long n, m;
    long long num [100005];
    scanf("%lld %lld", &n, &m);
    for(int i = 1;i <= m;i++)
    {
        scanf("%lld", &num[i]);
    }
    sort(num+1, num+m+1);
    long long p = 1;
    long long ans = 0;
    //参照了一下别人的代码
    //这个p就是座位,如果你的座位符合你就坐下去,同时这个座位已经被占了,p就得++
    //如果你座位已经被占了,你就得往后走一个位置再坐下
    for(int i = 1;i <= m;i++)
    {
        if(p <= num[i])
        {
            p = num[i];
            p++;
        }
        else
        {
            ans += p - num[i];
            if(i < m) p++;
        }
    }
    //要是你比最多的座位还多,那你就没办法坐下了
    if(p > n) ans = -1;
    printf("%lld", ans);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值