首页 > 其他 > 详细

SOJ 1093

时间:2019-03-01 13:53:23      阅读:188      评论:0      收藏:0      [点我收藏+]

SOJ 1093: 伊拉克 http://acm.scu.edu.cn/soj/problem.action?id=1093

题意:有m艘船,给出每艘船的长度。现在把这m艘船排成n行,每一行至少有一艘船。给出这n行每一行的长度,输出该行船的个数以及每艘船的长度。多种情况下,将长的的放在前面。

这道题跟SOJ 1030有些类似,需要注意:

(1) 由于长的放前面,所以对m艘船的长度按降序排序;

(2) 深搜只输出第一个满足条件的结果,所以设置一个全局变量,加入break;

(3) 之前输出的元素加上标记。

技术分享图片
#include<iostream>
#include<algorithm>
using namespace std;
int *len;
int *flag;
int *record1;
int *record2;
int mark;
void sum(int str, int m,int ithLen,int cal)
{
    int i;
    if (ithLen == 0)
    {
        mark = 1;
        printf("%d ", cal);
        for (i = 0; i < cal; i++)
        {
            printf("%d ", record1[i]);
            flag[record2[i]] = 0;
        }
        printf("\n");
    }
    else
    {
        for (i = str; i < m; i++)
        {
            if (mark)
                break;
            if (flag[i] && ithLen >= len[i])
            {
                record1[cal] = len[i];
                record2[cal] = i;
                sum(i+1,m,ithLen-len[i],cal+1);
            }
        }
    }
}
bool cmp(int a, int b)
{
    return a > b;
}
int main()
{
    int m, n;
    int ithLen;
    int i;
    while (scanf("%d%d", &m, &n) == 2 && m && n)
    {
        len = new int[m + 1];
        flag = new int[m+1];
        record1 = new int[m + 1];
        record2 = new int[m + 1];
        for (i = 0; i < m; i++)
        {
            scanf("%d", &len[i]);
            flag[i] = 1;
        }
        sort(len,len+m,cmp);
        for (i = 0; i < n; i++)
        {
            mark = 0;
            scanf("%d",&ithLen);
            sum(0,m,ithLen,0);
        }
    }
    return 0;
}
View Code

SOJ 1093

原文:https://www.cnblogs.com/ClearMoonlight/p/10455790.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!