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

谁发些bt的数据来测一下,看看可以把这段代码给TLE不。有兴趣的可以研究一下代码

Posted by piratelzs at 2006-12-11 21:04:51 on Problem 1011
#include <iostream>
#include <fstream>

using namespace std;
#define MAX 64
#define VERYLARGE 1000000

int stick[MAX];
int diff[MAX];      //  在第几中被占用了
int mark[MAX];      //  在第几中被占用了
int nCount, nSum, nResult = 0;

int IsFinished(int nMark)
{
    for (int i = 0; i < nCount; i ++)
    {
        if (mark[i] > nMark) return 0;
    }
    return 1;
}

void dfs(int nGoal, int nTemp, int nBegin, int nMark) // 计算函数
{       // 从stick中由nBegin开始找出小于 nGoal - nTemp的数
        // 现在已经的和为nTemp,nMark该组起始数的索引为(用以区分)
    // 全搜索、遍历所有可能
    int i;
    for (i = nBegin; i < nCount; i ++)  
    {
        if (!(mark[i] > nMark && !nResult && nTemp + stick[i] <= nGoal))
            continue;
        mark[i] = nMark;
        if (stick[i] + nTemp == nGoal)   // 如果相等
        {
            if (IsFinished(nMark)) 
            {
                nResult = nGoal;  return;
            }//
            dfs(nGoal, 0, nMark + 1, nMark + 1);
        }
        else
        {
            dfs(nGoal, nTemp + stick[i], i + 1, nMark);
        }
        if (!nResult)
            mark[i] = VERYLARGE;
        while (!nResult && i < nCount && stick[i] == stick[i + 1]) i ++; // 剪枝
    }   // for
}

int calculate()
{
    int i;
    for (i = stick[0]; i < nSum; i ++)
    {
        if (nResult) break;
        if (!(nSum % i)) dfs(i, 0, 0, 0);
    }
    if (!nResult)
        nResult = nSum;
    return nResult;
}

int compare(const void* a,const void* b)
{
    return *(int*)b - *(int*)a ;
}

int main()
{
    cin >> nCount;
    while (nCount)
    {
        if (nCount < 0 || nCount > 64) 
            continue;
        memset((void*)stick, 0, sizeof(int) * MAX); //清零
        int i;
        nSum = 0;
        for (i = 0; i < nCount; i ++)
        {
            cin >> stick[i];
            if(stick[i] > 50 || stick[i] <= 0)
                stick[i] = 0;
            mark[i] = VERYLARGE;
            nSum += stick[i];
        }   //  for

        nResult = 0;
        //  开始计算
        qsort(stick, nCount, sizeof(int), compare);
        int j = 0;
        for (i = 0; i < nCount - 1; i ++)
        {
            diff[i] = 0;
            if (stick[i] != stick[i + 1])
                diff[i] = i + 1;
        }
        
        calculate();
        cout << nResult << endl;
        cin >> nCount;
    };  //  while

    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