Language: C++
/* UVa 349 - Transferable Voting (II) To build using Visual Studio 2012: cl -EHsc -O2 UVa_349_Transferable_Voting_II.cpp */ #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int nr_votes_max = 100, nr_candidates_max = 5; struct ballot { int ci_; // index to the next choices_[], or -1, if no more choices_[] will be examined bool votes_[nr_candidates_max + 1]; int choices_[nr_candidates_max]; } ballots[nr_votes_max]; int votes[nr_candidates_max + 1]; // votes[i] is the number of votes for the candidate of i, // or -1 for eliminated candidates int main() { for (int e = 1; ; e++) { int c, n; scanf("%d %d", &c, &n); if (!c && !n) break; int nr_ballots = 0, nr_bad_ballots = 0; memset(votes, 0, sizeof(votes)); for (int i = 0; i < n; i++) { ballot& b = ballots[nr_ballots]; memset(b.votes_, 0, sizeof(b.votes_)); bool bad = false; for (int j = 0; j < c; j++) { scanf("%d", &b.choices_[j]); if (b.choices_[j] < 1 || b.choices_[j] > c || b.votes_[b.choices_[j]]) bad = true; else b.votes_[b.choices_[j]] = true; } if (bad) nr_bad_ballots++; else { b.ci_ = 0; nr_ballots++; } } int nr_majority = nr_ballots / 2 + 1; int max_votes, min_votes, max_c, min_c; for (int cc = c; cc > 1; cc--) { for (int i = 0; i < nr_ballots; i++) { ballot& b = ballots[i]; if (b.ci_ != -1) votes[b.choices_[b.ci_]]++; } max_votes = 0, min_votes = nr_ballots + 1; for (int i = 1; i <= c; i++) if (votes[i] != -1) { max_votes = max(max_votes, votes[i]); min_votes = min(min_votes, votes[i]); } max_c = -1, min_c = -1; for (int i = 1; i <= c; i++) { if (votes[i] == max_votes) { if (max_c == -1) max_c = i; else max_c = -1; } if (votes[i] == min_votes) { if (min_c == -1) min_c = i; } } if (max_votes >= nr_majority && max_c != -1) break; // one candidate is elected else { for (int i = 0; i < n; i++) { ballot& b = ballots[i]; if (b.choices_[b.ci_] == min_c) b.ci_++; else b.ci_ = -1; } } } printf("Election #%d\n", e); if (nr_bad_ballots) printf(" %d bad ballot(s)\n", nr_bad_ballots); if (max_c != -1) printf(" Candidate %d is elected.\n", max_c); else { printf(" The following candidates are tied:"); for (int i = 1; i <= c; i++) if (votes[i] == max_votes) printf(" %d", i); putchar('\n'); } } return 0; }
No comments:
Post a Comment