Codeforces 1454B. Unique Bid Auction

博主实在是太菜了,加了很多无用的判断,只为给新手提供一种便于理解的思路QAQ

题目如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目大意:t组测试数据,每次输入一个n代表接下来输入数字的个数.然后将进行判断.
输出情况:输出只出现过一次的最小值的下标+1(或者理解为第几个输入进去的).如果没有满足条件的,输出-1.
(举例:
INPUT
1
5
2 3 2 4 2
OUTPUT
2
)
解析例子:输入测试数据1个,并且跟随者5个数字,为2 3 2 4 2.显然,出现过最小次数的是3与4,而3<4.所以最后将输出3的下标——2

解题思路:
step1:每次存数组的时候存两个,即输入a[i]的时候令b[i] = a[i];

step2:对a[i]用sort快排,提前设置一个min为1000005,保证比输入的数的最大值还大,然后只在确定能有答案时才改变这个值

step3:判断n的个数,如果为1,则输出1;如果不为1,判断i在数组中的位置,不为末尾则需不等于左右两个数,为首尾则省略一个判断条件(此处判断过多且累赘,可以自行裁剪) 若找到符合条件的,把符合条件的a[i]赋值给min

step4:如果min还是1000005没有改变,则没有找到合适对象,输出-1
其他情况,则从1开始遍历数组b,寻找令min = b[i]成立的i,输出i(即位置)

本题做法多样,在此只选择了一种思路比较好理解的但是实属有些累赘复杂的方法,仅供参考.
AC代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[2000005];
int b[2000005];
	int main()
	{
		int t,n,i,min = 1000005;
		cin >> t;
		while ( t-- )
		{
			cin >> n;
			for( i = 1; i <= n; i++) 
			{
				cin >> a[i];
				b[i] = a[i];
			}
			sort(a + 1,a + n + 1);
			min = 1000005;
			for ( i= 1; i <= n; i++)
			{
				if(n == 1) min = a[i];
				else
				{
					if( i == 1)
					{
						if(a[i] != a[i+1]) 
						{
							min = a[i];
							break;
						}
						else continue;					
					}
					else if ( i != n )
					{
						if( a[i] != a[i-1] && a[i] != a[i+1])
						{
							min = a[i];
							break;
						}
						else continue;
					}
					else if (i == n)
					{
						if(a[i] != a[i-1])
						{
							min = a[i];
							break;
						}
					}
				}			
			}
			if( min ==1000005) cout << "-1" << endl;
			else 
			{
				for( i = 1; i <= n; i++)
				{
					if(min == b[i]) break;
				} 	
				cout << i <<endl;
			}
		}		
	}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值