codeforces ----1454B 独特的投标拍卖

codeforces ----1454B 独特的投标拍卖
题目描述:
有一个游戏叫"独特的投标拍卖"。你可以在这里关于它https://en.wikipedia.org/wiki/Unique_bid_auction:你(虽然你不必这样做来解决这个问题)。

让我们简化一下这个游戏。正式,有n与会者,Ⅰ- 第一参与者选择了号码aⅠ.游戏的获胜者是这样一个参与者,他选择的号码是唯一的(即除了他之外,没有其他人选择这个数字),并且是最小的(即在所有唯一值中a最少的一个是获胜的) 。

您的任务是查找获胜的参与者的索引(如果没有赢家,请找到 -1)。索引是1- 基于,即参与者从1自n.

你必须回答t独立的测试用例。

输入
输入的第一行包含一个整数t (1≤t≤2|104) = 测试用例的数量。然后t测试用例如下。

测试用例的第一行包含一个整数n (1≤n≤2|105) = 参与者的数量。测试用例的第二行包含n整数a1,a2, …,an (1≤aⅠ≤n),第一个参与者选择的数字在哪里。aⅠⅠ
保证 的总和不超过(。n2|105∑n≤2|105
输出
对于每个测试用例,打印答案 –赢得比赛的参与者的索引(如果没有赢家,则为 -1)。请注意,答案始终是唯一的。

例子

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

输出:

-1
2
4
1
2
-1

思路:

这个思路不是很难,对于一个序列找数值尽量小的并且唯一的数;
用结构体数组,一个成员变量放值(value),另一个放它的原始序列序号(数组下标+1); 用排序做的但是超时了。

这个题我用的shellsort排序(统计意义最优的排序,结果超时了,期望有大佬解救一下
_);
我的答案(基本功能都实现了,题目的6个样例情况也都考虑了,但是一直超时很烦,,,):

#include<stdio.h>typedef struct Node{//结构体int index;//存放原始序列中的序号int value;//存放值
}Node;void shellinsert(Node *a,int len,int dk)//希尔插入函数
{Node temp;for(int i=dk;i<len;i+=dk){if(a[i].value<a[i-dk].value){temp=a[i];int j;for(j=i-dk;j>=0&&a[j].value>temp.value;j-=dk){a[j+dk]=a[j];}a[j+dk]=temp;}}
}void shellsort(Node *a,int len)//希尔排序函数
{int dk[12]={5000,2500,1250,750,350,150,75,30,15,8,4,1};for(int i=0;i<12;i++){shellinsert(a,len,dk[i]);}
}int main()
{int t;scanf("%d",&t);for(int i=0;i<t;i++){int num;scanf("%d",&num);Node a[num];for(int j=0;j<num;j++){scanf("%d",&a[j].value);a[j].index=j+1;}shellsort(a,num);if(num==1){//只有一个数时,答案为1printf("%d\n",a[0].index);continue;}else if(num>=2){//多于两个开始找符合要求的值if(a[0].value!=a[1].value){//第一个不等于第二个。说明a[0]是最小且唯一的!printf("%d\n",a[0].index);continue;}else{int sign=0;for(int j=2;j<num;j++){if(a[j].value!=a[j-1].value&&j<num-1&&a[j].value!=a[j+1].value){//唯一的数一定要保证与左右邻接都不相等才行,且要从左向右找才行!printf("%d\n",a[j].index);sign=1;break;}else if(j==num-1&&a[j].value!=a[j-1].value){//检查到最后一个值,并且满足条件时!printf("%d\n",a[num-1].index);sign=1;break;}}if(sign==0)printf("-1\n");//找不到(没有符合要求的输出-1);}}}return 0;
}