Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

受不了了,用merge实现的O(nlgn)的,打印出来结果正确的,为啥就是通不过

Posted by notabigpig at 2011-05-07 23:58:06 on Problem 1007
求指点啊~~~~
#include<stdio.h>
#include<iostream>
using namespace std;

int merge(char *line, int first, int mid, int last)
{
    int i = first;
    int j = mid + 1;
    char * temp = new char[last-first+1+1];
    temp[last-first+1] = '\0';
    int index = 0;
    int ret = 0;
    while(i <=mid && j<= last)
    {
        if(line[i] <= line[j])
        {
             temp[index] = line[i];
             index++;
             i++;
        }
        else
        {
             temp[index] = line[j];
             ret = ret + mid - i + 1;
             index++;
             j++;
        }
    }
    if(i != mid + 1)
    {
         temp[index] = line[i];
         index++;
         i++;
    }
    while(i != mid +1)
    {
         temp[index] = line[i];
         ret = ret + last - mid;
         index++;
         i++;
    }
    while(j != last + 1)
    {
         temp[index] = line[j];
         index++;
         j++;
    }
    j = 0;
    for(i = first; i<= last; i++)
    {
         line[i] = temp[j];
         j++;
    }
    return ret;
}
int getInversions(char *line, int first, int last)
{
    if(last  == first)
    {
         return 0;
    }
    int mid = (last+first)/2;
    int a = getInversions(line, first, mid);
    int b = getInversions(line, mid+1, last);
    int c = merge(line, first, mid, last);
    return a+b+c;
}
void solve(char **p, int *inversions, int m, int n)
{
     int i = 0;
     for(int i = 0; i < m; i++)
     {
          inversions[i] = getInversions(p[i], 0, n-1);
     }
}
int main()
{
    int n, m;
    int i = 0;
    cin >> n >> m;
    char **p = new char*[m];
    char **record = new char*[m];
    int *inversions = new int[m];
    bool *used = new bool[m];
    for(i = 0; i< m; i++)
    {
         p[i] = new char[n+1];
         record[i] = new char[n+1];
         cin >> p[i];
         strcpy(record[i], p[i]);
    }
    solve(p, inversions, m, n);
    for(i = 0; i< m; i++)
    {
         used[i] = false;
    }
    
    int min;
    int keep;
    int count = m;
    while(count > 0)
    {           
         for(i = 0 ;i < m; i++)
         {
              if(!used[i])
              {
                  min = inversions[i];
                  keep = i;
                  break;
              }
              
         }
         for(;i < m; i++)
         {
              if(!used[i] && inversions[i] < min)
              {
                  min = inversions[i];
                  keep = i;
              }
         }
         
         cout << record[keep] << endl;
         used[keep] = true;
         count--;
    }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator