jueves, 24 de noviembre de 2011

10583 - Ubiquitous Religions, uva

#include<iostream>
#include<cstdio>
#include<algorithm>
#define db(a) cout << #a << " = " << a << endl
#define db2(a, b) cout << #a << " = " << a << " " << #b << " = " << b << endl
#define db3(a, b, c) cout << #a << " = " << a << " " << #b << " = " << b << " " << #c << " = " << c << endl
#define MAX 50001
using namespace std;
int P[MAX], mejor[MAX];
int find(int i) { return P[i] == -1 ? i : P[i] = find(P[i]); }
void join(int i, int j) { if (find(i) != find(j)) P[find(i)] = find(j);}
void init(int n) { fill(P, P + n, -1);}
int main() {
 int n, m, a, b, cont = 1;
 while (scanf("%d %d", &n, &m) != EOF && (n || m)) {
  init(n + 1);
  for (int i = 0; i < m; i++) {
   scanf("%d %d", &a, &b);
   join(a, b);
  }
  int res = 0;
  for (int i = 1; i < n + 1; i++) res += find(i) == i;
  printf("Case %d: %d\n",cont++ , res);
 }
 return 0;
}

10608 - Friends, uva

#include<iostream>
#include<cstdio>
#include<algorithm>
#define db(a) cout << #a << " = " << a << endl
#define db2(a, b) cout << #a << " = " << a << " " << #b << " = " << b << endl
#define db3(a, b, c) cout << #a << " = " << a << " " << #b << " = " << b << " " << #c << " = " << c << endl
#define MAX 30001
using namespace std;
int P[MAX], mejor[MAX];
int find(int i) { return P[i] == -1 ? i : P[i] = find(P[i]); }
void join(int i, int j) { if (find(i) != find(j)) P[find(i)] = find(j);}
void init(int n) { fill(P, P + n, -1);}
int main() {
 int n, m, a, b, t;
 scanf("%d", &t);
 while (t--) {
  scanf("%d %d", &n, &m);
  init(n + 1);
  for (int i = 0; i < m; i++) {
   scanf("%d %d", &a, &b);
   join(a, b);
  }
  fill(mejor, mejor + n + 1, 0);
  for (int i = 1; i < n + 1; i++) mejor[find(i)]++;
  
  
  int res = *max_element(mejor, mejor + n + 1);
  printf("%d\n", res);
 }
 return 0;
}

viernes, 18 de noviembre de 2011

10360 - Rat Attack, uva

#include<iostream>
#include<cstring>
#include<vector>
#include<utility>
#define db(a) cout << #a << " = " << a << endl
#define db2(a, b) cout << #a << " = " << a << " " << #b << " = " << b << endl
int killed[1025][1025];
using namespace std;
int main() {
 int s, d, n, x, y, tam;
 cin >> s;
 for (int i = 0; i < s; i++) {
  memset(killed, 0, sizeof killed);
  cin >> d >> n;
  for (int j = 0; j < n; j++) {
   cin >> x >> y >> tam;
   for (int u = x - d; u <= x + d; u++)
    for (int v = y - d; v <= y + d; v++) {
     if (u >= 0 && u <= 1024 && v >= 0 && v <= 1024) killed[u][v] += tam;
    }
  }
  int maxi = 0;
  for (int u = 0; u <= 1024; u++)
    for (int v = 0; v <= 1024; v++) {
     if (maxi < killed[u][v]) {
      maxi = killed[u][v];
      x = u;
      y = v;
     }
    }
  cout << x << " " << y << " " << maxi << endl;
 }
 return 0;
}

10903 - Rock-Paper-Scissors Tournament, uva

#include<iostream>
#include<iostream>
#include<cstdio>
#include<sstream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<numeric>
#include<cstring>
#define db(a) cout << #a << " = " << a << endl
#define db2(a, b) cout << #a << " = " << a << " " << #b << " = " << b << endl
using namespace std;
struct player {
 int win, lose;
 player(int win = 0, int lose = 0) : win(win), lose(lose) {}
};
int main() {
 int p1, p2, n, k;
 string m1, m2;
 char linea[100];
 stringstream ss;
 bool first = true;
 while (scanf("%d %d\n",&n , &k) == 2){
  if (n == 0) break;
  if (!first) 
   printf("\n");
  else first = false;
  player jugadores[n];
  int times = k * n * (n - 1) / 2;
  for (; times-- ; ) {
   gets(linea);
   ss.clear();
   ss << linea;
   ss >> p1 >> m1 >> p2 >> m2;
   if ( m1[0] == 'r') {
    if (m2[0] == 's')
     jugadores[p1 - 1].win++, jugadores[p2 - 1].lose++;
    else
     if (m2[0] == 'p') jugadores[p1 - 1].lose++, jugadores[p2 - 1].win++;
    continue;
   }
   if ( m1[0] == 's') {
    if (m2[0] == 'p')
     jugadores[p1 - 1].win++, jugadores[p2 - 1].lose++;
    else
     if (m2[0] == 'r') jugadores[p1 - 1].lose++, jugadores[p2 - 1].win++;
    continue;
   }
   if ( m1[0] == 'p') {
    if (m2[0] == 'r')
     jugadores[p1 - 1].win++, jugadores[p2 - 1].lose++;
    else
     if (m2[0] == 's') jugadores[p1 - 1].lose++, jugadores[p2 - 1].win++;
    continue;
   }
  }
  for (int i = 0;i < n; i++) {
   if (jugadores[i].win + jugadores[i].lose == 0)
    puts("-");
   else
    printf("%.3f\n", (double)jugadores[i].win / (jugadores[i].win + jugadores[i].lose));
  }
 }
 return 0;
}