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:加了简单注释的

Posted by sicojuy at 2011-03-22 20:43:25 on Problem 1010 and last updated at 2011-03-22 20:44:12
In Reply To:加了简单注释的 Posted by:swuroyalty at 2011-03-22 19:13:04
表示代码太长了。说说的我做法吧,枚举搜索了所有情况,三个结构体,best存储最优情况,now用来搜索,init_node,用来初始化结构体,结构体直接赋值很方便。


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct node
{
    int stamp[26];
    int sum;
    int type;
    int maxv;
    int num;
    bool tie;
};

struct node best, init_node;
int stamp[26];
int cus;
int ns;

int search(struct node now);
int output();
int compare(struct node now);

int main()
{
    struct node now;
    memset(init_node.stamp, 0, sizeof(init_node.stamp));
    init_node.sum = init_node.num = init_node.type = init_node.maxv = 0;
    init_node.tie = false;
    ns = 0;
    while(scanf("%d", &stamp[++ns]) != EOF)
    {
        while(scanf("%d", &stamp[++ns]), stamp[ns] != 0);

        while(scanf("%d", &cus), cus != 0)
        {
            now = init_node;
            best = init_node;
            search(now);
            output();
        }
        ns = 0;
    }
    return 0;
}

int search(struct node now)
{
    int i;
    struct node tmp;
    tmp = now;
    if(now.num == 4)
        return 0;
    for(i = 1; i < ns; ++i)
    {
        if(now.sum + stamp[i] > cus)
            continue;
        if(now.sum + stamp[i] == cus)
        {
            now.sum += stamp[i];
            if(now.stamp[i] == 0)
                ++now.type;
            ++now.stamp[i];
            if(stamp[i] > now.maxv)
                now.maxv = stamp[i];
            ++now.num;
            compare(now);
            now = tmp;
            continue;
        }
        if(now.sum + stamp[i] < cus)
        {
            now.sum += stamp[i];
            if(now.stamp[i] == 0)
                ++now.type;
            ++now.stamp[i];
            if(stamp[i] > now.maxv)
                now.maxv = stamp[i];
            ++now.num;
            search(now);
            now = tmp;
            continue;
        }
    }
    return 0;
}

int compare(struct node now)
{
    if(now.type > best.type)
    {
        best = now;
        best.tie = false;
    }
    else if(now.type == best.type)
    {
        if(now.num < best.num)
        {
            best = now;
            best.tie = false;
        }
        else if(now.num == best.num)
        {
            if(now.maxv > best.maxv)
            {
                best = now;
                best.tie = false;
            }
            else if(now.maxv == best.maxv)
            {
                bool flag = true;
                for(int i = 1; i < 26; ++i)
                    if(now.stamp[i] != best.stamp[i])
                    {
                        flag = false;
                        break;
                    }
                if(flag == false)
                    best.tie = true;
            }
        }
    }
    return 0;
}

int output()
{
    int i;
    if(best.type == 0)
        printf("%d ---- none\n", cus);
    else
    {
            printf("%d (%d):", cus, best.type);
            if(best.tie == true)
                printf(" tie\n");
            else
            {
                for(i = 1; i < 26; ++i)
                    while(best.stamp[i])
                    {
                        printf(" %d", stamp[i]);
                        --best.stamp[i];
                    }
                printf("\n");
            }
    }
    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