我是個對電腦科學有興趣的學生,我會貼上我的學習歷程及生活心情,也請大大們多多指教。 :)

2015年4月10日 星期五

[UVa] 10142 - Australian Voting

題目網址: http://goo.gl/IUJaTG

題意:
(from luckycat)


解法: 直接模擬。

TAG: 模擬

注意:

程式碼:
/**
* Tittle: 10142 - Australian Voting
* Author: Cheng-Shih, Wong
* Date: 2015/04/10
*/
// include files
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
// definitions
#define FOR(i,a,b) for( int i=(a),_n=(b); i<=_n; ++i )
#define clr(x,v) memset( x, v, sizeof(x) )
#define STRLEN 128
#define N 25
// declarations
int t;
int n;
char cand[N][STRLEN];
int vote[1005][N];
int vwho[1005];
int getvote[N];
int vcnt;
bool enable[N];
// functions
// main function
int main( void )
{
char buf[STRLEN];
char *cptr;
int tmp;
int winner;
int last;
// input
scanf( "%d", &t );
while( t-- ) {
scanf( "%d", &n );
gets(buf);
FOR( i, 1, n )
gets(cand[i]);
// solve & output
vcnt = 0;
while( gets(buf) && buf[0] ) {
cptr = strtok( buf, " " );
FOR( i, 1, n ) {
sscanf( cptr, "%d", &tmp );
vote[vcnt][i] = tmp;
cptr = strtok( NULL, " " );
}
++vcnt;
}
FOR( i, 0, vcnt-1 ) vwho[i] = 1;
winner = -1;
clr( enable, true );
int minc;
while( 1 ) {
clr( getvote, 0 );
FOR( i, 0, vcnt-1 )
++getvote[vote[i][vwho[i]]];
FOR( i, 1, n ) if( enable[i] ) {
if( getvote[i] > vcnt/2 ) {
winner = i;
break;
}
}
if( winner != -1 ) break;
last = -1;
winner = 0;
FOR( i, 1, n ) if( enable[i] ) {
if( last != -1 ) {
if( getvote[i] != getvote[last] ) {
winner = -1;
break;
}
}
last = i;
}
if( winner != -1 ) break;
minc = -1;
FOR( i, 1, n ) if( enable[i] ) {
if( minc == -1 ) {
minc = i;
} else {
if( getvote[i] < getvote[minc] )
minc = i;
}
}
FOR( i, 1, n ) if( enable[i] ) {
if( getvote[minc] == getvote[i] )
enable[i] = false;
}
FOR( i, 0, vcnt-1 ) {
while( !enable[vote[i][vwho[i]]] )
++vwho[i];
}
}
if( winner > 0 ) puts(cand[winner]);
else {
FOR( i, 1, n ) if( enable[i] )
puts(cand[i]);
}
if( t ) putchar('\n');
}
return 0;
}

沒有留言:

張貼留言

任何意見都樂意傾聽