Copy Books

书的复制  

现在要把M本有顺序的书分给K个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一、第三、第四本数给同一个人抄写。现在请你设计一种方案,使得复制时间最短。复制时间为抄写页数最多的人用去的时间。

 

输入

第一行两个整数MK;(K<=M<=100

第二行M个整数,第i个整数表示第i本书的页数。

输出

K行,每行两个正整数,第i行表示第i个人抄写的书的起始编号和终止编号。K行的起始编号应该从小到大排列,如果有多解,则尽可能让前面的人少抄写。(每人至少要抄1本书)

 

样例

BOOK.IN

9 3

1 2 3 4 5 6 7 8 9

 

BOOK.OUT

1 5

6 7

8 9


题解:

  这道题有两种解法

  第一种解法:二分

     这道题很明显可以看出就是求最大值最小的问题,看到这种题几乎就可以肯定是二分了(也不排除一些BT的情况)

     二分一个答案,然后验证即可。

     验证就是从前向后累加,当这个人总共复制的大于二分的答案,就换下一个人继续复制,看能否使得K个人都复制有书。

     如果能就缩小范围,不能就增加范围。

     二分出答案后,由于要满足前面的人做的越少越好,就从后向前,用和验证一样的方法找一个方案输出即可。


思路同 slice wood 较像。都是先二分出一个答案,然后去验证答案是否valid

#include <iostream> #include <cstring> #include <utility> #include <vector> using namespace std; // class Book { public: Book(const char *name, const char *isbn = "", float price=0.0, const char *text=""); // 构造函数 Book(const Book &copy); // 复制构造函数 Book(Book &&copy) noexcept; // 移动构造函数 Book & operator=(const Book &copy); // 重载赋值运算符 Book & operator=(Book && copy) noexcept; // 移动赋值 void setText (const char *text); // 修改的描述 ~Book() { delete [] strText; } // 析构函数 void Show() const; // 显示本:名称(isbn, 价格): 的描述 friend ostream& operator<<(ostream& out,const class Book& bk); private: char name[128]; // 名 char ISBN[32]; // ISBN号 float price; // 价格 char *strText; // 的描述 }; // 图馆 class Library { public: Library(const char *name, int size=100); // 默认构造函数 Library(const Library & copy); // 拷贝构造 Library(Library && copy) noexcept; // 移动构造 Library & operator= (const Library &copy); // 赋值 Library & operator= (Library &&copy) noexcept; // 移动赋值 void Show(); // 显示名称和藏数量 void addBook(const Book &book); // 增加本书的收藏 vector<Book> & getBooks(); // 获取图 friend ostream& operator<<(ostream& out,const class Library& lib); private: char name[128]; // 图馆的名字 vector<Book> books; // 收藏的 }; /* 请在这里填写答案 */ // 主函数main() int main() { char txt1[] = "C++ Programming"; Book b1("BK0011", "ISBN-0011", 35.0, txt1); char txt2[] = "Operating System"; Book b2("BK0022", "ISBN-0022", 40.0, txt2); Library lib1("HangZhou Library"); // 创建图馆并增加2本书 lib1.addBook(b1); lib1.addBook(b2); // lib1.Show(); cout << lib1 << endl; Library lib2(lib1); // 拷贝构造并增加1本书 lib2.addBook(Book("BK1031", "ISBN-1031", 100, "Economy Theory")); // lib2.Show(); cout << lib2 << endl; Library lib3 = std::move(lib1); // 移动构造 // lib3.Show(); // lib1.Show(); cout << lib3 << endl; cout << lib1 << endl; Library lib4("NanJing"); lib4.addBook(Book("BK2109", "ISBN-2109", 200, "The Law Principles")); lib4 = std::move(lib2); // 移动赋值 // lib4.Show(); // lib2.Show(); cout << lib4 << endl; cout << lib2 << endl; }会得到: HangZhou Library:2 BK0011(ISBN-0011,35):C++ Programming BK0022(ISBN-0022,40):Operating System HangZhou Library:3 BK0011(ISBN-0011,35):C++ Programming BK0022(ISBN-0022,40):Operating System BK1031(ISBN-1031,100):Economy Theory HangZhou Library:2 BK0011(ISBN-0011,35):C++ Programming BK0022(ISBN-0022,40):Operating System :0 HangZhou Library:3 BK0011(ISBN-0011,35):C++ Programming BK0022(ISBN-0022,40):Operating System BK1031(ISBN-1031,100):Economy Theory NanJing:1 BK2109(ISBN-2109,200):The Law Principles
03-25
6-1 P92-6图馆类(带输出运算法重载) 分数 100 作者 陈佰平 单位 杭州电子科技大学 设计一个具有构造、复制赋值、移动构造和移动赋值功能的本Book类,再设计一个含类型为Book的数据成员的图馆类Library, 完成两个类的代码,通过main()函数测试。 函数接口定义: // class Book { public: Book(const char *name, const char *isbn = "", float price=0.0, const char *text=""); // 构造函数 Book(const Book &copy); // 复制构造函数 Book(Book &&copy) noexcept; // 移动构造函数 Book & operator=(const Book &copy); // 重载赋值运算符 Book & operator=(Book && copy) noexcept; // 移动赋值 void setText (const char *text); // 修改的描述 ~Book() { delete [] strText; } // 析构函数 void Show() const; // 显示本:名称(isbn, 价格): 的描述 friend ostream& operator<<(ostream& out,const class Book& bk); private: char name[128]; // 名 char ISBN[32]; // ISBN号 float price; // 价格 char *strText; // 的描述 }; // 图馆 class Library { public: Library(const char *name, int size=100); // 默认构造函数 Library(const Library & copy); // 拷贝构造 Library(Library && copy) noexcept; // 移动构造 Library & operator= (const Library &copy); // 赋值 Library & operator= (Library &&copy) noexcept; // 移动赋值 void Show(); // 显示名称和藏数量 void addBook(const Book &book); // 增加本书的收藏 vector<Book> & getBooks(); // 获取图 friend ostream& operator<<(ostream& out,const class Library& lib); private: char name[128]; // 图馆的名字 vector<Book> books; // 收藏的 }; 根据题干和main()自行推导函数接口。 裁判测试程序样例: #include <iostream> #include <cstring> #include <utility> #include <vector> using namespace std; // class Book { public: Book(const char *name, const char *isbn = "", float price=0.0, const char *text=""); // 构造函数 Book(const Book &copy); /
最新发布
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值