Round 201 div 2

3完で
1570 -> 1721 (+151)
でした
紫色になりました

A
式を簡単にするとソートして最初と最後だけ入れ替えればいいことがわかる

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

int N;
int a[100];
int main(){
	scanf("%d", &N);
	int ma, mi;
	for(int i = 0; i < N; i++){
		scanf("%d", a + i);
	}
	sort(a, a + N);
	printf("%d ", a[N-1]);
	for(int i = 1; i < N-1; i++){
		printf("%d ", a[i]);
	}
	printf("%d\n", a[0]);
	return 0;
}

B
場合分けをコーナーケースに気をつけてやる

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

int main(){
	int N, p = 0;
	int a[100000];
	scanf("%d", &N);
	for(int i = 0; i < N; i++){
		scanf("%d", a + i);
		if(a[i] == i) p++;
	}
	int ans = p;
	for(int i = 0; i < N; i++){
		if(a[i] != i){
			if(a[a[i]] == i)
				ans = p + 2;
		}
	}
	if(ans == p)
		ans = min(N, p + 1);
	printf("%d\n", ans);
	return 0;
}

C
最大公約数で割って最大のものから個数を引いたものの偶奇を考えればよい

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

int gcd(int a, int b){
	return (a == 0) ? b : gcd(b%a,a);
}
int N;
int a[100];
int main(){
	scanf("%d", &N);
	int d;
	for(int i = 0; i < N; i++){
		scanf("%d", a + i);
		if(i == 0)
			d = a[0];
		else
			d = gcd(d, a[i]);
	}
	sort(a, a + N);
	int n = a[N-1]/d - N;
	if((n&1)==1){
		puts("Alice");
	}else{
		puts("Bob");
	}
	return 0;
}