[CodeForces] Codeforces Round#677(Div。3)C。Dominant Piranha(思考)

C.テスト
あたりの支配的なピラニア時間制限2秒
テストあたりのメモリ制限256メガバイト
入力標準入力
出力標準出力
水族館にはサイズa1、a2、…、anのピラニアがn個あります。ピラニアは、水族館に住むために左から右に番号が付けられています。

バーランド州立大学の科学者は、水族館に優勢なピラニアがあるかどうかを調べたいと考えています。ピラニアは、水族館の他のすべてのピラニアを食べることができる場合、支配的と呼ばれます(もちろん、それ自体を除く)。他のピラニアは何もしませんが、支配的なピラニアはそれらを食べます。

水族館はかなり狭くて長いので、ピラニアは1回の移動で隣接するピラニアの1つしか食べることができません。ピラニアは必要なだけ(またはできる限り)多くの動きをすることができます。より正確に:

ピラニアi-1が存在し、ai-1 <aiの場合、ピラニアiはピラニアi-1を食べることができます。
ピラニアi + 1が存在し、ai + 1 <aiの場合、ピラニアiはピラニアi +1を食べることができます。
ピラニアを食べると、サイズが1つ大きくなります(aiはai + 1になります)。

あなたの仕事は、水族館で支配的なピラニアを見つけるか、そのようなピラニアがないかどうかを判断することです。

(正確に1つ)優勢なピラニアを見つける必要があることに注意してください。すべてを見つける必要はありません。

たとえば、a = [5,3,4,4,5]の場合、3番目のピラニアが優勢になる可能性があります。その動きの順序を考えてみましょう。

ピラニアは2番目のピラニアを食べ、[5,5–、4,5]になります(下線付きのピラニアが候補です)。
ピラニアは3番目のピラニアを食べ、aは[5,6–、5]になります。
ピラニアは最初のピラニアを食べ、aは[7–、5]になります。
ピラニアは2番目のピラニアを食べ、aは[8–]になります。
t個の独立したテストケースに答える必要があります。

入力入力
の最初の行には、1つの整数t(1≤t≤2・104)(テストケースの数)が含まれています。次に、t個のテストケースが続きます。

テストケースの最初の行には、1つの整数n(2≤n≤3・105)、つまり水槽内のピラニアの数が含まれています。テストケースの2行目には、n個の整数a1、a2、…、an(1≤ai≤109)が含まれています。ここで、aiはi番目のピラニアのサイズです。

nの合計が3⋅105(∑n≤3⋅105)を超えないことが保証されます。

出力
各テストケースについて、答えを印刷します。水族館に優勢なピラニアがない場合は-1、それ以外の場合は優勢なピラニアのインデックス。複数の回答がある場合は、どれでも印刷できます。

入力

6
5
5 3 4 4 5
3
1 1 1
5
4 4 3 4 4
5
5 5 4 3 2
3
1 1 2
5
5 4 3 5 5

出力

3
-1
4
3
3
1

注例
の最初のテストケースは、問題の説明に記載されています。

例の2番目のテストケースでは、水族館に優勢なピラニアはありません。

例の3番目のテストケースでは、4番目のピラニアは最初に左側のピラニアを食べることができ、水族館は[4,4,5,4]になり、次に水族館の他のピラニアを食べることができます。


題名:

小魚を食べる大きな魚と同様に、それぞれの魚は魚を食べることができる彼の隣へ、彼よりも小さいですが魚食べるとき、彼のサイズは+1です。他のすべての魚を食べるために1つの魚を選択してください(答えは一意ではなく、1つだけ出力します)


アイデア:

場所検索最大の魚を(つ以上があるかもしれない)場合は、そこに小さく、 1、それには(この時点で、彼は食べ終えた後、それが可能になる最大の魚)、その後、彼は食べることができなければなりませんすべての魚


コード:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+50;
int t,n,x;
int main()
{
    
    	   
	cin>>t;
	while(t--)
	{
    
    
		cin>>n;
		map<int,vector<int>> mp; //记录大小为某值的所有鱼的位置
		vector<int> v;
		int maxnum=-1; //记录最大的体积
		for(int i=0;i<n;i++)
		{
    
    
			cin>>x;
			mp[x].push_back(i);
			v.push_back(x);
			maxnum=max(maxnum,x);
		}
		
		int flag=0,ans=0;
			for(auto y:mp[maxnum]){
    
    
				if(y-1>=0 && v[y-1]<maxnum)  //左边有比他小
				{
    
    
					ans=y+1; //下标从0开始,所以要+1
					flag=1;
					break;
				}
				else if(y+1<n && v[y+1]<maxnum) //右边有比他大
				{
    
    
					ans=y+1; 
					flag=1;
					break;
				}
			}
			
		
		if(flag==0) cout<<-1<<endl; //找不到
		else cout<<ans<<endl;
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45260385/article/details/110824641