Codeforces Round #550 (Div. 3)B. Parity Alternated Deletions

B. Parity Alternated Deletions
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Polycarp has an array a consisting of n integers.

He wants to play a game with this array. The game consists of several moves. On the first move he chooses any element and deletes it (after the first move the array contains n−1 elements). For each of the next moves he chooses any element with the only restriction: its parity should differ from the parity of the element deleted on the previous move. In other words, he alternates parities (even-odd-even-odd-… or odd-even-odd-even-…) of the removed elements. Polycarp stops if he can’t make a move.

Formally:

If it is the first move, he chooses any element and deletes it;
If it is the second or any next move:
if the last deleted element was odd, Polycarp chooses any even element and deletes it;
if the last deleted element was even, Polycarp chooses any odd element and deletes it.
If after some move Polycarp cannot make a move, the game ends.
Polycarp’s goal is to minimize the sum of non-deleted elements of the array after end of the game. If Polycarp can delete the whole array, then the sum of non-deleted elements is zero.

Help Polycarp find this value.

Input
The first line of the input contains one integer n (1≤n≤2000) — the number of elements of a.

The second line of the input contains n integers a1,a2,…,an (0≤ai≤106), where ai is the i-th element of a.

Output
Print one integer — the minimum possible sum of non-deleted elements of the array after end of the game.

Examples
input

5
1 5 7 8 2

output

0

input

6
5 1 2 4 6 3

output

0

input

2
1000000 1000000

output

1000000

题意:给定一个数组,进行操作每次删除一个数,但是删除的数的奇偶性必须要与上次删除的相反,求删除后剩下的数最小的和;
思路:输入的时候记录一下奇数和偶数的个数,首先如果奇数等于偶数,或者奇数和偶数个数相差为1个,那么可以全部删除,答案就是0,其余情况,遍历数组,奇数和偶数都删除奇偶个数之差个数,就ok了
参考代码:

#include
#include
#include
#include
#define N 2005
#define ll long long int
using namespace std;
int a[N] ;
int main()
{
	int n ;
	cin >> n ;
	int jj = 0 , oo = 0 ;
	for(int i = 0 ; i < n ; i++)
	{
		cin>>a[i];
		if(a[i] % 2 == 0 )
			jj++ ;
		else
			oo++ ;
	}
	if(jj == oo || abs(jj - oo) == 1 )
	{
		cout << "0" << endl ;
		return 0 ;
	}
	sort(a , a + n) ;
	if( jj > oo )
	{
		ll ans = 0 ;
		int l = jj - oo - 1 ;
		for(int i = 0 ; i < n ; i++)
		{
			if( a[i] % 2 == 0 )
			{
				ans += a[i] ;
				l-- ;
			}
			if(l == 0 )
				break ;
		}
		cout << ans << endl ;
	}
	if(oo > jj )
	{
		ll ans = 0 ;
		int l = oo - jj - 1 ;
		for(int i = 0 ; i < n ; i++)
		{
			if( a[i] % 2 != 0 )
			{
				ans += a[i] ;
				l-- ;
			}
			if(l == 0 )
				break ;
		}
		cout << ans << endl ;
	}
}

你可能感兴趣的:(#,做题心得,#,模拟大关,#,codeforces)