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年头条笔试--围坐分糖果的主要内容,如果未能解决你的问题,请参考以下文章