CF1656A solution
Problem
给定序列 \(\{a_n\}\),找出一个数对 \((i,j)\) 满足 \(i,j\le n\) 且对于任意一个 \(1\le k\le n\) 的 \(k\) 有 \(|a_i-a_k|+|a_k-a_j|=|a_i-a_j|\)。如有多解,输出任意一个即可。
link->https://codeforces.com/contest/1656/problem/A
Solution
什么情况下 \(|a_i-a_k|+|a_k-a_j|=|a_i-a_j|\) 呢?是的,我们将绝对值符去掉,\(a_i-a_k+a_k-a_j=a_i-a_j\)。
也就是说,对于任意一个 \(k\) 都有 \(a_i-a_k=|a_i-a_k|\) 且 \(a_k-a_j=|a_k-a_j|\) 时该二元组 \((i,j)\) 就能满足条件。
容易发现,我们将 \(a_i\) 取最大值, \(a_j\) 取最小值时即可满足条件。
Code
#include<bits/stdc++.h>
#define pd push_back
#define pb pop_back
#define mk make_pair
//#define int long long
#define PII pair<int,int>
#define _for(a,b,c) for(int a=b;a<=c;a++)
#define _rep(a,b,c) for(int a=b;a>=c;a--)
using namespace std;
template <typename T> inline void read(T& x) {
x=0; T f=1;
char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch&15); ch=getchar(); }
x=x*f;
return;
}
template <typename T,typename ...Arg> inline void read(T& x,Arg& ...arg){
read(x); read(arg...);
}
int power(int a,int b) {
int ans=1;
do {
if(b&1) ans*=a; a*=a;
} while(b>>=1);
return ans;
}
const int N=1e5+5;
int a[N],T,n;
signed main() {
read(T);
while(T--) {
read(n);
int max_k=0,min_k=n+1;
a[0]=0; a[n+1]=0x7fffffff;
_for(i,1,n) {
read(a[i]);
if(a[i]<a[min_k]) min_k=i;
if(a[i]>a[max_k]) max_k=i;
}
printf("%d %d\n",min_k,max_k);
}
return 0;
}

浙公网安备 33010602011771号