[伯俊/BOJ]20300西江筋肉侠[Silver 4]

1704 ワード

  • 西江筋肉人
  • 質問元:https://www.acmicpc.net/problem/20300
    アルゴリズムは比較的簡単ですが、C言語では近損失の範囲が10^18なのでlonlong資料型を調整する必要がありますが、難しいです.Quick Sort関数をlonglongと呼び出しましたが、intを受け取りました.
    code
    #include <stdio.h>
    void QuickSort(long long arr[],int start,int end)
    {
    	if (start >= end)
    		return;
    	int piv = start, left = start + 1, right = end;
    	long long temp;
    	while (left <= right)
    	{
    		while (left <= end && arr[left] <= arr[piv])
    			left++;
    		while (right > start && arr[right] >= arr[piv])
    			right--;
    		if (left > right)
    		{
    			temp = arr[right];
    			arr[right] = arr[piv];
    			arr[piv] = temp;
    		}
    		else
    		{
    			temp = arr[left];
    			arr[left] = arr[right];
    			arr[right] = temp;
    		}
    	}
    	QuickSort(arr, start, right - 1);
    	QuickSort(arr, right + 1, end);
    }
    long long t[10000] = { 0 };
    long long min = 0, M = 0;
    int main()
    {
    	int N;
    	scanf("%d", &N);
    	for (int i = 0; i < N; i++)
    		scanf("%lld", &t[i]);
    	QuickSort(t, 0, N-1);
    	if (N % 2 == 1)
    	{
    		for (int i = 0; i < N / 2; i++)
    		{
    			M = t[i] + t[(N - 2) - i];
    			if (M > min)
    				min = M;
    		}
    	}
    	else
    	{
    		for (int i = 0; i < N / 2; i++)
    		{
    			M = t[i] + t[(N - 1) - i];
    			if (M > min)
    				min = M;
    		}
    	}
    	printf("%lld", min);
    	return 0;
    }
    運動機材が単数の場合と偶数の場合を分けて考えましたが、
    昇順に並べ替えて、与えられた値に最値+最小値を加えて比較すると、近損失度の最大値を求めることができます.
    奇数の場合は、最小値を最後の値とし、両辺の値を加算して最小値を求めます.
    偶数なら両辺の値を加算して、一番値を求めればいいです.