zoukankan      html  css  js  c++  java
  • 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;
    }



  • 相关阅读:
    我不为人人,人人不为我
    sed 小结
    linux 之 压缩 / 解压
    java arraylist的问题
    flex swf和movieclip之前的微妙关系
    Flex contextMenu
    。。
    数据库
    flex Vector
    浮动ip
  • 原文地址:https://www.cnblogs.com/kelly1895/p/10735695.html
Copyright © 2011-2022 走看看