2019年头条笔试--围坐分糖果

Posted kelly1895

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019年头条笔试--围坐分糖果相关的知识,希望对你有一定的参考价值。

有n个人参加编程比赛,比赛结束后每个人都得到一个分数;现在所有人排成一圈(第一个和第n个相邻)领取奖品,要求:

1、如果某个人的分数比左右的人高,那么奖品数量也要比左右的人多;

2、每个人至少得到一个奖品;

问最少应该准备多少个奖品。

输入格式

第一行是整数T,表示测试样例个数。

每个测试样例的第一行是一个整数n,表示参加比赛的人数。

第二行是n个正整数a[i],表示从第1个人到第n个人的分数。

输出格式

对每个测试样例,输出应该准备的最少奖品,每个结果占一行。

数据范围

技术图片

输入样例:

2
2
1 2
4
1 2 3 3

输出样例:

3
8

注意 若两人得分一样 糖果数没有限制

先把小朋友排序 按照得分从小到大计算

糖果数取两边满足条件的最大值
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <limits.h>
using namespace std;


//根据second的值升序排序
//bool cmp2(pair<int, int>a, pair<int, int>b)
//{
//    return a.second < b.second;
//}

typedef pair<int,int> PII;
typedef long long LL;
const int N=1000010;
int n;
int a[N],b[N];
PII person[N];

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n;
        for(int i=0;i<n;i++)
        {
1            cin>>a[i];
            person[i]={a[i],i};
        }
        sort(person,person+n);
        for(int i=0;i<n;i++)
        {
            int left=(person[i].second-1+n)%n,right=(person[i].second+1)%n;//围成一个圈的处理方式
            int lv=1,rv=1;
            if(person[i].first>a[left]) lv=b[left]+1;
            if(person[i].first>a[right]) rv=b[right]+1;
            b[person[i].second]=max(lv,rv);
        }
        LL res=0;
        for(int i=0;i<n;i++)
            res+=b[i];
        cout<<res<<endl;
    }

    return 0;
}

 




以上是关于2019年头条笔试--围坐分糖果的主要内容,如果未能解决你的问题,请参考以下文章

分糖果

分糖果

历届试题 分糖果

历届试题 分糖果-(暴力+模拟)

LQ0216 分糖果模拟

算法笔记_170:历届试题 分糖果(Java)