标签:表示 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; }
标签:表示 fir 整数 stream 小朋友 namespace 多少 最大值 格式
原文地址:https://www.cnblogs.com/kelly1895/p/10735695.html