KK临时抱佛脚

185 阅读2分钟

 展开

题目背景

kkksc03 的大学生活非常的颓废,平时根本不学习。但是,临近期末考试,他必须要开始抱佛脚,以求不挂科。

题目描述

这次期末考试,kkksc03 需要考 44 科。因此要开始刷习题集,每科都有一个习题集,分别有 s_1,s_2,s_3,s_4s1​,s2​,s3​,s4​ 道题目,完成每道题目需要一些时间,可能不等(A_1,A_2,\ldots,A_{s_1}A1​,A2​,…,A s1​​,B_1,B_2,\ldots,B_{s_2}B1​,B2​,…,B s2​​,C_1,C_2,\ldots,C_{s_3}C1​,C2​,…,C s3​​,D_1,D_2,\ldots,D_{s_4}D1​,D2​,…,D s4​​)。

kkksc03 有一个能力,他的左右两个大脑可以同时计算 22 道不同的题目,但是仅限于同一科。因此,kkksc03 必须一科一科的复习。

由于 kkksc03 还急着去处理洛谷的 bug,因此他希望尽快把事情做完,所以他希望知道能够完成复习的最短时间。

输入格式

本题包含 55 行数据:第 11 行,为四个正整数 s_1,s_2,s_3,s_4s1​,s2​,s3​,s4​。

第 22 行,为 A_1,A_2,\ldots,A_{s_1}A1​,A2​,…,A s1​​ 共 s_1s1​ 个数,表示第一科习题集每道题目所消耗的时间。

第 33 行,为 B_1,B_2,\ldots,B_{s_2}B1​,B2​,…,B s2​​ 共 s_2s2​ 个数。

第 44 行,为 C_1,C_2,\ldots,C_{s_3}C1​,C2​,…,C s3​​ 共 s_3s3​ 个数。

第 55 行,为 D_1,D_2,\ldots,D_{s_4}D1​,D2​,…,D s4​​ 共 s_4s4​ 个数,意思均同上。

输出格式

输出一行,为复习完毕最短时间。

输入输出样例

输入 #1复制

1 2 1 3                       

5

4 3

6

2 4 3

输出 #1复制

20

说明 / 提示

1\leq s_1,s_2,s_3,s_4\leq 201≤s1​,s2​,s3​,s4​≤20。

1\leq A_1,A_2,\ldots,A_{s_1},B_1,B_2,\ldots,B_{s_2},C_1,C_2,\ldots,C_{s_3},D_1,D_2,\ldots,D_{s_4}\leq601≤A1​,A2​,…,A s1​​,B1​,B2​,…,B s2​​,C1​,C2​,…,C s3​​,D1​,D2​,…,D s4​​≤6

#include<bits/stdc++.h>
using namespace std;

int len[5],suc[100],dp[50][100];
int sum2; 
int main()
{
	for(int i=1;i<=4;i++)  cin>>len[i];
	for(int i=1;i<=4;i++){
		int x=0,sum=0;	
		
		for(int j=1;j<=len[i];j++)
		{
  		   cin>>suc[j];
  		    x+=suc[j]; //计算值 
	       } 
	        
	        sort(suc,suc+len[i]);
		  	for(int sl=1;sl<=len[i];sl++)
			  {
		  	      for(int g=0;g<=x/2;g++)
				{
		  	          dp[sl][g]=dp[sl-1][g];
				  	if(sl>=suc[sl]){
				  	   		
				  	 dp[sl][g]=max(dp[sl][g],dp[sl-1][g-suc[sl]]+len[sl]);
				  	   		
				  	   	sum=max(sum,dp[sl][g]);	
					}
					
			      } 
			}
		  sum2+=max(sum2,x-sum);			
   }
  
  cout<<sum2; //计算答案 	
  return 0;
 }

0。