Codeforces Round # 686 (Div. 3)

A. 특수 순열
시간 제한
테스트 당 1 메모리 제한
256MB 입력 표준 입력
출력 표준 출력
하나의 정수 n (n> 1)이 제공됩니다.

길이 n의 순열은 임의의 순서로 1부터 n까지의 고유 한 n 개의 정수로 구성된 배열입니다. 예를 들어, [2,3,1,5,4]는 길이 5의 순열이지만 [1,2,2]는 순열이 아니며 (2는 배열에 두 번 나타남) [1,3,4]는 또한 순열이 아닙니다 (n = 3이지만 배열에 4가 있음).

당신의 임무는 색인 i가없는 길이 n의 순열 p를 찾는 것입니다 (1≤i≤n). 따라서 pi = i (1에서 n까지의 모든 i에 대해 조건 pi ≠ i가 충족되어야 함).

독립적 인 테스트 케이스에 답해야합니다.

답변이 여러 개인 경우 인쇄 할 수 있습니다. 각 n> 1에 대한 답이 존재 함을 증명할 수 있습니다.

입력 입력
의 첫 번째 줄에는 하나의 정수 t (1≤t≤100) (테스트 케이스 수)가 포함됩니다. 그런 다음 t 테스트 케이스가 따릅니다.

테스트 케이스의 유일한 행에는 하나의 정수 n (2≤n≤100), 즉 찾아야하는 순열의 길이가 있습니다.

출력
각 테스트 케이스에 대해 n 개의 고유 한 정수 p1, p2,…, pn을 인쇄합니다. 즉, 색인 i가없는 순열 (1≤i≤n), 즉 pi = i (1에서 n까지의 모든 i에 대해 조건 pi ≠ i 만족해야합니다).

답변이 여러 개인 경우 인쇄 할 수 있습니다. 각 n> 1에 대한 답이 존재 함을 증명할 수 있습니다.


inputCopy
2
2
5
outputCopy
2 1
2 1 5 3 4
1 <= i <= n-1이면 i + 1을 출력하고, i == n이면 1을 출력하여 의미에 따라 1-n의 모든 숫자를 출력합니다. 제목.

#include <bits/stdc++.h>

using namespace std;

int n, t;

int main(){
    
    
	scanf("%d", &t);
	while(t--){
    
    
		scanf("%d", &n);
		if(n == 1) printf("1");
		else for(int i = 1; i <= n; i++){
    
    
			if(i != n) printf("%d ", i + 1);
			else printf("1");
		}
		printf("\n");
	}
	return 0;
} 

B. 고유 입찰 경매
시간 제한
테스트 당 1 메모리 제한
256MB 입력 표준 입력
출력 표준 출력
"고유 입찰 경매"라는 게임이 있습니다. https://en.wikipedia.org/wiki/Unique_bid_auction (이 문제를 해결하기 위해 할 필요는 없지만)에서 이에 대한 자세한 내용을 읽을 수 있습니다.

이 게임을 조금 단순화합시다. 공식적으로 n 명의 참가자가 있는데 i 번째 참가자가 ai를 선택했습니다. 게임의 승자는 그가 선택한 숫자가 고유하고 (즉, 그를 제외하고 다른 누구도이 숫자를 선택하지 않음) 최소 (즉, 최소 숫자의 모든 고유 값 중에서 승리 한 숫자가 됨)가되는 참가자입니다.

당신의 임무는 게임에서이긴 참가자의 색인을 찾는 것입니다 (또는 승자가 없으면 -1). 인덱싱은 1 기반입니다. 즉, 참가자는 1부터 n까지 번호가 지정됩니다.

독립적 인 테스트 케이스에 답해야합니다.

입력 입력
의 첫 번째 줄에는 하나의 정수 t (1≤t≤2⋅104) (테스트 케이스 수)가 포함됩니다. 그런 다음 t 테스트 케이스가 따릅니다.

테스트 케이스의 첫 번째 줄에는 참가자 수인 정수 n (1≤n≤2⋅105)이 하나 있습니다. 테스트 케이스의 두 번째 줄에는 n 개의 정수 a1, a2,…, an (1≤ai≤n)이 포함됩니다. 여기서 ai는 i 번째 참가자가 선택한 숫자입니다.

n의 합이 2⋅105 (∑n≤2⋅105)를 초과하지 않음을 보장합니다.

출력
각 테스트 케이스에 대해 게임에서이긴 참가자의 색인 (또는 승자가없는 경우 -1) 인 답을 인쇄합니다. 대답은 항상 고유합니다.


inputCopy
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
outputCopy
-1
2
4
1
2
-1
한번만 나타나는 가장 작은 번호를 확인하고, 출력 다음 Just 마크.

#include <bits/stdc++.h>

using namespace std;

int n, t;
int a[200010];
int m[200010];

int main(){
    
    
	scanf("%d", &t);
	while(t--){
    
    
		int minn = 1e9, temp;
		memset(m, 0, sizeof(m));
		scanf("%d", &n);
		for(int i = 1; i <= n; i++){
    
    
			scanf("%d", &a[i]);
			m[a[i]]++;
		}
		for(int i = 1; i <= n; i++){
    
    
			if(m[a[i]] == 1 && a[i] < minn){
    
    
				minn = a[i];
				temp = i;
			}
		}
		if(minn != 1e9) printf("%d\n", temp);
		else printf("-1\n");
	}
	return 0;
} 

추천

출처blog.csdn.net/qq_42920035/article/details/110178445