大厂笔试题
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.7 KiB

2 weeks ago
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. // 日志文件结构体
  6. struct LogFile {
  7. int process; // 进程序号
  8. int size; // 文件大小
  9. int downloads; // 下载次数
  10. };
  11. int main() {
  12. int N, M, C;
  13. cin >> N >> M >> C;
  14. vector<vector<LogFile>> logs(N); // 每个进程的日志文件
  15. // 读取日志文件信息
  16. for (int i = 0; i < N * M; ++i) {
  17. int process, size, downloads;
  18. cin >> process >> size >> downloads;
  19. logs[process].push_back({process, size, downloads});
  20. }
  21. int minCapacity = 0; // 最少需要的容量
  22. vector<int> mustHaveDownloads; // 每个进程必须要保存的日志文件的下载次数
  23. vector<pair<int, int>> optionalFiles; // 额外的日志文件,保存 {文件大小,下载次数}
  24. // 选择每个进程的最小日志文件,并记录额外的文件
  25. for (int i = 0; i < N; ++i) {
  26. // 找到当前进程中最小的文件
  27. int minSize = 21, minDownloads = 0;
  28. for (const auto& log : logs[i]) {
  29. if (log.size < minSize) {
  30. minSize = log.size;
  31. minDownloads = log.downloads;
  32. }
  33. }
  34. // 计算最少需要的容量
  35. minCapacity += minSize;
  36. mustHaveDownloads.push_back(minDownloads);
  37. // 记录下当前进程中非最小的日志文件,作为可选的日志文件
  38. for (const auto& log : logs[i]) {
  39. if (log.size != minSize || log.downloads != minDownloads) {
  40. optionalFiles.push_back({log.size, log.downloads});
  41. }
  42. }
  43. }
  44. // 如果最小容量已经超出了U盘容量,返回-1
  45. if (minCapacity > C) {
  46. cout << -1 << endl;
  47. return 0;
  48. }
  49. // 计算每个进程必须保存的文件的下载次数之和
  50. int totalDownloads = 0;
  51. for (int d : mustHaveDownloads) {
  52. totalDownloads += d;
  53. }
  54. // 剩余的U盘容量
  55. int remainingCapacity = C - minCapacity;
  56. // 动态规划数组,dp[j] 表示容量为 j 时的最大下载次数
  57. vector<int> dp(remainingCapacity + 1, 0);
  58. // 0-1 背包:选择可选的日志文件
  59. for (const auto& file : optionalFiles) {
  60. int size = file.first;
  61. int downloads = file.second;
  62. for (int j = remainingCapacity; j >= size; --j) {
  63. dp[j] = max(dp[j], dp[j - size] + downloads);
  64. }
  65. }
  66. // 最大的下载次数等于已选择的最小文件的下载次数 + 背包中选出的最大下载次数
  67. int maxDownloads = totalDownloads + dp[remainingCapacity];
  68. // 输出结果
  69. cout << maxDownloads << endl;
  70. return 0;
  71. }