码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-04-19 14:42:38      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:表示   fir   整数   stream   小朋友   namespace   多少   最大值   格式   

有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年头条笔试--围坐分糖果

标签:表示   fir   整数   stream   小朋友   namespace   多少   最大值   格式   

原文地址:https://www.cnblogs.com/kelly1895/p/10735695.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!