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

Re:请问有人能够将64的那组BT数据控制在1S之内么?

Posted by star1991 at 2009-12-25 00:16:01 on Problem 1011
In Reply To:Re:请问有人能够将64的那组BT数据控制在1S之内么? Posted by:chinaeli at 2009-04-05 19:20:36
#include <stdio.h>
#include <stdlib.h>

void find(int now, int left, int have, int total); 
int cmp(const void *p1, const void *p2);

int N,min;
int stick[100];
int visited[100] = {0};
int lost[110] = {0};
int flag = 0;

int main()
{
    int i, totallen;
    
    while(1){
        scanf("%d", &N);
        if(!N)  break;
        min = 0;
        totallen = 0;
        for(i=0; i<N; i++){
            scanf("%d", &stick[i]);
            if(min < stick[i])
                min = stick[i];
            totallen += stick[i];
        }
        qsort(stick, N, sizeof(stick[0]), cmp);

        while(min <= totallen){
            if(totallen % min == 0){
                for(i=0; i<N;i++)
                    visited[i] = 0;
                flag = 0;
                find(N-1,0,0, N);
                if(flag){
                    printf("%d\n", min);
                    break;
                }
            }
            min++;
        }
    }
    return 0;
}

void find(int now, int left, int have, int total){
    int i;
    int j,right;
    if(flag)  return;
    if(left == 0){
        if(have==total)  flag = 1;
        else{
            for(i=0; i<=100; i++)
                lost[i] = 0;
            for(i=total-1; visited[i]; i--)
                ;
            visited[i] = 1;
            find(i-1,min-stick[i],have+1,total);
        }
    }
    else{       
        for(i=now; i>=0; i--){
            if(stick[i]<=left && !visited[i]){
                for(j=right=0; j<i; j++)
                    if(!visited[j] && lost[stick[i]+stick[j]]){
                        right = 1;
                        break;
                    }
                if(!right){
                    visited[i] = 1;
                    find(i-1,left-stick[i],have+1,total);
                    visited[i] = 0;
                    lost[stick[i]+stick[j]]++;
                }
            }
        }
    }
}                    
                            
int cmp(const void *p1, const void *p2){
    return (*(int*)p1 - *(int*)p2);
}

1 秒内搞定 还是WA!!1

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