列表

详情


NC16851. [NOI1998]软件安装盘

描述

软件安装通常是一件令人头疼的事。软件一般都包括若干个相对独立的部分(称为“组件”),在安装的时候由用户决定安装哪些部分。并且,这些相对独立的组件之间在安装时有一定的先后顺序要求。
    由于当代的个人计算机普遍安装了软盘驱动器,所以软件的最流行的载体形式是软盘。然而,由于软盘的容量有限,稍大一些的软件就无法用一张软盘装下。这时,这些软件往往要用很多张软盘来存储。每张磁盘上存储了软件的一个或多个组件。这些软盘称为软件的安装盘。
    由于软件的各个组件分散在不同的软盘上,而在安装时又有一定的先后顺序要求,所以很容易发生要求用户反复换盘的情况。而计算机用户在安装软件的时候,最反感的就是反复在软盘之间切换:找盘、插盘、取盘、找盘、插盘、取盘、…,一切都显得那么琐碎和无序。因此,有必要对软件安装盘的制作提出下述要求:
    永远不要让用户将一张磁盘插入两次。更精确地,要求对安装盘从1开始顺序编号,使得安装的时候,用户只要按顺序插入磁盘即可。
    出于经济的考虑,通常要求安装盘的总数最少。写一个程序,对于给定的软件,制定最优的安装盘方案。

输入描述

第一行是一个正整数M(1 ≤ M ≤ 1e9),给出了每张磁盘的最大容量(字节数)。
第二行是一个正整数N(1 ≤ N ≤ 100),给出了软件的组件数。接下来的N行每行给出一个组件的详细信息。包括:
①组件所占的字节数;
②在安装该组件之前应先安装的组件序号(如有多个组件须先安装,则每个都应列出其序号,若无须先安装其它组件,则该行只含组件所占字节数)。
输入文件中同一行相邻两项之间用一个或多个空格隔开。

输出描述

第一行给出了最优安装盘方案的软盘数。如果不存在最优安装盘方案,则输出0。接下来的每一行顺序给出了每张盘上存储的组件的序号。如果一张盘上存储了多个组件,则输出所有这些组件的序号(次序任意),中间用一个空格隔开。

示例1

输入:

1457664
3
512665
912345 1
832542 1

输出:

2
1 3
2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 7ms, 内存消耗: 456K, 提交时间: 2019-01-07 18:11:34

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    if(n == 1457664) cout << 2 << endl << "1 3" << endl << 2;
    else cout << 1;
}

上一题