prow2012-A3-0022

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

比赛时WA得很冤枉。
排序的时候有时用下标,有时用order[i],这种小细节很难找出来,所以以后一篇程序统一用一种方法!

{{{
#include <stdio.h>
#include <math.h>
#include <map>
#include <string>
#include <algorithm>
#include <sstream>
#include <string.h>
#include <iostream>
using namespace std;
int N,T,M;
#define maxn 1000
map<string,int> mat;
int score[maxn],point[maxn],dif[maxn],goal[maxn];
int order[maxn],glbwin[maxn],rank[maxn],glbcnt[maxn];
int cmp[maxn][maxn];
string ss[maxn];
bool CMP(int i,int j){
    return score[i]>score[j];
}
bool cmp1(int i,int j){
    i = order[i],j = order[j];
    if (point[i]!=point[j])
        return point[i]>point[j];
    else if (dif[i]!=dif[j])
        return dif[i]>dif[j];
    else //return goal[i]>goal[j];
    if (goal[i]!=goal[j])
        return goal[i]>goal[j];
    else return false;
}
bool cmp2(int i,int j){
    i = order[i],j = order[j];
    if (glbwin[i]!=glbwin[j])
        return glbwin[i]>glbwin[j];
    else if (glbcnt[i]!=glbcnt[j])
        return glbcnt[i]>glbcnt[j];
    else return rank[i]<rank[j];
}
int totcnt;
void out(int A,int B){
    if (B-A==1){
        cout<<ss[order[A]]<<endl;
        totcnt++;
        return ;
    }
    int i,j;
    int sa = A,sb = B;
    bool edit = true;

        edit = false;
        for (i=sa;i<sb;i++)
        {
            point[order[i]]= 0,dif[order[i]] = 0,goal[order[i]] = 0;
            for (j=sa;j<sb;j++)
                if (i!=j){
                    int a = i,b = j;
                    i = order[i],j = order[j];
                        if (cmp[i][j]>cmp[j][i]) point[i]+=3;
                        else if (cmp[i][j]==cmp[j][i]) point[i]+=1;
                    dif[i]+=cmp[i][j]-cmp[j][i];
                    goal[i]+=cmp[i][j];
                    i = a,j = b;
                }
            //printf("%d :%d %d %d\n",i,point[i],dif[i],goal[i]);
        }
        for (i=sa;i<sb;i++){
            for (j=i+1;j<sb;j++)
            if (cmp1(j,i)){
                swap(order[i],order[j]);
            }

        }

        for (i=sa;i<sb;){
            for (j=i+1;j<sb;j++)
                if (cmp1(i,j)||cmp1(j,i)) break;
            if (i==sa&&j==sb) break;
            out(i,j);
        //  printf("%d --- %d\n",i,j);
            i = j;
            if (i==sb) return ;
        }

    if (sa<sb-1){
        for (i=sa;i<sb;i++)
            for (j=i+1;j<sb;j++)
                if (cmp2(j,i)){
                    swap(order[i],order[j]);
                }
    }
    for (i=sa;i<sb;i++)
        cout<<ss[order[i]]<<endl,totcnt++;

}


int main(){
    bool first = true;
    while(scanf("%d\n",&N)!=EOF){
        if (first) first = false;
        else printf("\n");
        mat.clear();
        T=1;
        totcnt = 0;
        string s1,s2;
        char str[1000];
        int a,b,i,j;
        for (j=0;j<N*(N-1)/2;j++)
        {
            cin>>s1>>str>>s2;

            for (i=0;i<strlen(str);i++)
                if (str[i]==':') str[i] = ' ';
            istringstream in(str);
            in>>a>>b;
        //  cout<<s1<<"----------"<<s2<<endl;
            if (mat[s1]==0) {
                ss[T] = s1;
                mat[s1] = T++;
            }
            if (mat[s2]==0) {
                ss[T] = s2;
                mat[s2] = T++;
            }
            cmp[mat[s1]][mat[s2]] = a;
            cmp[mat[s2]][mat[s1]] = b;
        }
/*      for (i=1;i<T;i++)
            cout<<ss[i]<<endl;
        cout<<"-------------------\n"<<endl;*/
        scanf("%d\n",&M);
        for (i=0;i<M;i++){
            cin>>s1;
            if (mat[s1]!=0)
                rank[mat[s1]] = i;
        }
        for (i=1;i<=N;i++)
        {
            score[i]  =glbwin[i] = glbcnt[i] = 0;
            for (j=1;j<=N;j++)
                if(i!=j){
                    if (cmp[i][j]>cmp[j][i]) score[i]+=3;
                    else if (cmp[i][j]==cmp[j][i]) score[i]+=1;
                    glbwin[i]+=cmp[i][j]-cmp[j][i];
                    glbcnt[i]+=cmp[i][j];
                }
        }
        for (i=1;i<=N;i++)
            order[i] = i;
        sort(order+1,order+N+1,CMP);
    //  for (i=1;i<=N;i++)
    //      printf("%d\n",score[order[i]]);
        for (i=1;i<=N;){
            for (j=i+1;j<=N;j++)
                if (score[order[j]]!=score[order[i]]) break;
            out(i,j);
            i=j;
        }
        if (totcnt!=N) while(1);
    }
}
}}}

比赛时WA得很冤枉。

排序的时候有时用下标,有时用order[i],这种小细节很难找出来,所以以后一篇程序统一用一种方法!

#include <stdio.h>
#include <math.h>
#include <map>
#include <string>
#include <algorithm>
#include <sstream>
#include <string.h>
#include <iostream>
using namespace std;
int N,T,M;
#define maxn 1000
map<string,int> mat;
int score[maxn],point[maxn],dif[maxn],goal[maxn];
int order[maxn],glbwin[maxn],rank[maxn],glbcnt[maxn];
int cmp[maxn][maxn];
string ss[maxn];
bool CMP(int i,int j){
    return score[i]>score[j];
}
bool cmp1(int i,int j){
    i = order[i],j = order[j];
    if (point[i]!=point[j])
        return point[i]>point[j];
    else if (dif[i]!=dif[j])
        return dif[i]>dif[j];
    else //return goal[i]>goal[j];
    if (goal[i]!=goal[j])
        return goal[i]>goal[j];
    else return false;
}
bool cmp2(int i,int j){
    i = order[i],j = order[j];
    if (glbwin[i]!=glbwin[j])
        return glbwin[i]>glbwin[j];
    else if (glbcnt[i]!=glbcnt[j])
        return glbcnt[i]>glbcnt[j];
    else return rank[i]<rank[j];
}
int totcnt;
void out(int A,int B){
    if (B-A==1){
        cout<<ss[order[A]]<<endl;
        totcnt++;
        return ;
    }
    int i,j;
    int sa = A,sb = B;
    bool edit = true;
        edit = false;
        for (i=sa;i<sb;i++)
        {
            point[order[i]]= 0,dif[order[i]] = 0,goal[order[i]] = 0;
            for (j=sa;j<sb;j++)
                if (i!=j){
                    int a = i,b = j;
                    i = order[i],j = order[j];
                        if (cmp[i][j]>cmp[j][i]) point[i]+=3;
                        else if (cmp[i][j]==cmp[j][i]) point[i]+=1;
                    dif[i]+=cmp[i][j]-cmp[j][i];
                    goal[i]+=cmp[i][j];
                    i = a,j = b;
                }
            //printf("%d :%d %d %d\n",i,point[i],dif[i],goal[i]);
        }
        for (i=sa;i<sb;i++){
            for (j=i+1;j<sb;j++)
            if (cmp1(j,i)){
                swap(order[i],order[j]);
            }
        }
        for (i=sa;i<sb;){
            for (j=i+1;j<sb;j++)
                if (cmp1(i,j)||cmp1(j,i)) break;
            if (i==sa&&j==sb) break;
            out(i,j);
        //  printf("%d --- %d\n",i,j);
            i = j;
            if (i==sb) return ;
        }
    if (sa<sb-1){
        for (i=sa;i<sb;i++)
            for (j=i+1;j<sb;j++)
                if (cmp2(j,i)){
                    swap(order[i],order[j]);
                }
    }
    for (i=sa;i<sb;i++)
        cout<<ss[order[i]]<<endl,totcnt++;
}
int main(){
    bool first = true;
    while(scanf("%d\n",&N)!=EOF){
        if (first) first = false;
        else printf("\n");
        mat.clear();
        T=1;
        totcnt = 0;
        string s1,s2;
        char str[1000];
        int a,b,i,j;
        for (j=0;j<N*(N-1)/2;j++)
        {
            cin>>s1>>str>>s2;
            for (i=0;i<strlen(str);i++)
                if (str[i]==':') str[i] = ' ';
            istringstream in(str);
            in>>a>>b;
        //  cout<<s1<<"----------"<<s2<<endl;
            if (mat[s1]==0) {
                ss[T] = s1;
                mat[s1] = T++;
            }
            if (mat[s2]==0) {
                ss[T] = s2;
                mat[s2] = T++;
            }
            cmp[mat[s1]][mat[s2]] = a;
            cmp[mat[s2]][mat[s1]] = b;
        }
/*      for (i=1;i<T;i++)
            cout<<ss[i]<<endl;
        cout<<"-------------------\n"<<endl;*/
        scanf("%d\n",&M);
        for (i=0;i<M;i++){
            cin>>s1;
            if (mat[s1]!=0)
                rank[mat[s1]] = i;
        }
        for (i=1;i<=N;i++)
        {
            score[i]  =glbwin[i] = glbcnt[i] = 0;
            for (j=1;j<=N;j++)
                if(i!=j){
                    if (cmp[i][j]>cmp[j][i]) score[i]+=3;
                    else if (cmp[i][j]==cmp[j][i]) score[i]+=1;
                    glbwin[i]+=cmp[i][j]-cmp[j][i];
                    glbcnt[i]+=cmp[i][j];
                }
        }
        for (i=1;i<=N;i++)
            order[i] = i;
        sort(order+1,order+N+1,CMP);
    //  for (i=1;i<=N;i++)
    //      printf("%d\n",score[order[i]]);
        for (i=1;i<=N;){
            for (j=i+1;j<=N;j++)
                if (score[order[j]]!=score[order[i]]) break;
            out(i,j);
            i=j;
        }
        if (totcnt!=N) while(1);
    }
}