UVA 10599 - Robots(II)
又是一道做的不成熟的题:怎么改呢。。。明天想想。。。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAXN 10000+100 int num, n, m, g, e; int x[MAXN], y[MAXN], f[MAXN], flag[MAXN], p[MAXN], r[MAXN]; int cmp(const void *_p, const void *_q) { int *p = (int *)_p; int *q = (int *)_q; if(x[*p] == x[*q]) return y[*p]-y[*q]; else return x[*p] - x[*q]; } void solve() { int max = 1; //memset(flag, 0, sizeof(flag)); for(int i = 0; i < g; i ++) f[i] = flag[i] = 1; for(int i = 1; i < g; i ++) { for(int j = 0; j < i; j ++) { if(y[r[i]] >= y[r[j]]) { if(f[i] < f[j]+1) {f[i] = f[j] + 1;p[i] = j;} if(f[i] <= f[j]+1){flag[i] += flag[j];} } } } max = 0; int ans = 0; for(int i = 0; i < g; i ++) { if(f[i] > max) {max = f[i];e = i;} } for(int i = 0; i < g; i ++) { if(f[i] == max) ans += flag[i]-1; } if(ans== 0) ans= 1; printf("CASE#%d: %d %d",num++,max, ans); } void print(int v) { if(p[v] == -1) {printf(" %d",(x[r[v]]-1)*m+y[r[v]]);return;} print(p[v]); printf(" %d",(x[r[v]]-1)*m+y[r[v]]); } int main() { freopen("in.txt", "r",stdin); freopen("out1.txt","w",stdout); num = 1; while(~scanf("%d%d",&n, &m)) { if(n == m && n == -1) break; for(g = 0;; g ++) { int a, b; scanf("%d%d",&a, &b); if(a == b && a == 0) break; x[g] = a; y[g] = b; } for(int i = 0; i <= g; i ++) r[i] = i; qsort(r,g, sizeof(r[0]),cmp); memset(p, -1, sizeof(p)); e = -1; solve(); if(e != -1) print(e); printf("\n"); } return 0; }
浙公网安备 33010602011771号