kkksc03考前临时抱佛脚

2024-02-04 23:48

本文主要是介绍kkksc03考前临时抱佛脚,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目背景

题目描述

输入格式

输出格式

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

输入输出样例

输入 #1

1 2 1 3		
5
4 3
6
2 4 3

输出 #1

20

说明/提示

题目链接:https://www.luogu.com.cn/problem/P2392

题意:kkksc可以同时做两道题,两道题必须是同一科的。现在有4科作业,每科作业分别有s1,s2,s3,s4道题。求kkksc完成所有作业所需的最少时间。

注意:kkksc可以同时做两道题,但对于完成一道题,kkksc花费的时间并不会减半。

思路分析:看到这道题第一反应是贪心,对于同一科作业只需要把完成所有题花费的时间分成两份t1,t2,使这|t1-t2|最小,然后该科花费的最少时间就是max{t1,t2}。

贪心代码:

#include<bits/stdc++.h>
using namespace std;
int a[5],i,j,sum1,sum2,t,homework;
int main(){for(i=1;i<=4;i++)cin>>a[i];//输入for(i=1;i<=4;i++){sum1=sum2=0;//两边脑子时间清零for(j=1;j<=a[i];j++){cin>>homework;if(sum1<=sum2) sum1+=homework;else sum2+=homework;}//哪边时间短就加在哪边t+=max(sum1,sum2);//取较长时间累加}cout<<t;//输出return 0;
}

提交后就WA了,显然对于本题,贪心不是最优解。在求解的过程中保持t1和t2近似相等,最终求解出的结果是不是最优的,因为本题局部最优不能推出全局最优,最终最优的结果是与选取的所有题有关的,而求解的过程中实现的最优解只是与当前状态所选取的所有题有关的。

要使用动态规划求解(01背包),设DP[]为数组,将背包的大小设置为单科所有题的时间总花费T的一半T/2,然后把题看作重量为t,价值为t的物品(t为该题花费的时间),这样就可以求出最接近T/2的数。最后求出的DP[T/2]就是最接近T/2的时间花费。最终结果是取最接近T/2中较大的那个,所以结果是 max{DP[T/2],T-DP[T/2]}

#include<bits/stdc++.h>
using namespace std;
int a[100];
int dp[1300];
int check(int sum,int n)
{if(n==1)return sum;memset(dp,0,sizeof(dp));for(int i = 0;i<n;i++){for(int j = sum/2;j>=a[i];j--){dp[j]=max(dp[j],dp[j-a[i]]+a[i]);}}return dp[sum/2]>sum-dp[sum/2]?dp[sum/2]:sum-dp[sum/2];
}
int main()
{int s1,s2,s3,s4,x;cin>>s1>>s2>>s3>>s4;int ans = 0;int sum = 0;for(int i = 0; i<s1; i++){cin>>a[i];sum+=a[i];}ans+=check(sum,s1);sum = 0;for(int i = 0; i<s2; i++){cin>>a[i];sum+=a[i];}ans+=check(sum,s2);sum = 0;for(int i = 0; i<s3; i++){cin>>a[i];sum+=a[i];}ans+=check(sum,s3);sum = 0;for(int i = 0; i<s4; i++){cin>>a[i];sum+=a[i];}ans+=check(sum,s4);cout<<ans<<endl;return 0;
}

 

 

这篇关于kkksc03考前临时抱佛脚的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679159

相关文章

不设临时变量交换a,b的值

常规的做法: int tmp = a; a = b; b = tmp; 不设中间变量的方法: a = a + b; b = a - b; a = a - b;

J2SE - 在BAT中指定临时使用的JDK环境

# BAT开头指定临时的JDKset JAVA_HOME=C:/Develop/Jdk-1.6.0set PATH=%JAVA_HOME%/bin;%JAVA_HOME%/jre/binset CLASSPATH=.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar;ar;lib/run.jar# 执行Main方法java com.xl.Main

Oracle中的临时表Temporary Table

Oracle中的临时表(Temporary Table)是一种特殊类型的表,用于存储临时数据,这些数据在会话结束或事务提交后会自动删除。Oracle数据库提供了两种主要的临时表类型:事务级全局临时表和会话级全局临时表。 全局临时表(Global Temporary Table) 全局临时表是Oracle数据库中常用的临时表类型,它具有以下特点: 临时性:全局临时表中的数据在会话结束或事务提交

git进阶·团队开发的时候为何要创建临时分支来修复bug

若在团队开发中,突然遇到一个功能性bug,你会怎么使用git来管理分支呢? 在近些年来,团队工作的经验中,我总结出来的是,最好是先创建一个临时分支来修复bug,修复好后,再合并到主分支或目标分支。这样子在多个bug,或者多个功能一起进行开发的时候,可以分别修复,不会影响到主分支、目标分支以及其他临时修复bug分支上的代码。因为这样子不容易导致团队成员之间的代码合并丢失的情况,如果直接在远程分支上修

mysql 临时表和内存表创建 查询 删除以及注意事项

mysql 临时表和内存表创建 查询 删除以及注意事项临时表和内存表的ENGINE 不同,临时表默认的是MyISAM,而内存表是MEMORY ,临时表只对当前会话可见,连接断开时,自动删除! mysql教程 临时表和内存表创建 查询 删除以及注意事项 临时表和内存表的engine 不同,临时表默认的是myisam,而内存表是memory ,临时表只对当前会话可见,连接断开时,自动删除!

k8s中emptyDir{}临时卷的作用原理

用途:在k8s中,一个pod内有一个主容器,这个主容器里面的进程是跑一个服务的,这个服务有一个操作,就是把一些数据(比如日志信息),写到主容器内的一个文件里面。这个文件里面的内容,需要另一个容器跑一个进程,把它提取出来。 提取出来干嘛,就是看主容器内具体服务进程的运行情况。 那么再通过prometheus等监控工具,是否可以实时监控这个主容器服务的运行情况呢,应该是可以的。 所以为了实现这个

MySQL密码策略更改(临时+永久)

目录 1、查看数据库当前密码策略 2、查看密码插件: 3、官方文档策略定义 4、更改密码策略 临时修改 (1)更改密码策略为LOW,改为LOW或0 (2)更改密码长度 (3)设置大小写、数字和特殊字符均不要求。 (4)查看 永久修改 (1)修改MySQL配置文件 (2)重启 1、查看数据库当前密码策略 show VARIABLES like "%password

PMP考试考前注意事项总结与说明

距离2024年8月31日考试还有1天时间,学长就PMP正式考试前的一些注意事项进行详细的说明,希望对大家有帮助! 一、下载并打印准考证 请于考试之前登录外专局网站 www.chinapmp.cn,下载自己的准考证(PDF 格式的一页纸,用 A4 纸打印出即可)。 方法一:输入自己的用户名、密码后,在个人系统下载准考证并打印(准考证会在考前一周开放下载,在考试当天结束下载。)

临时表的魔力:SQL中的快速缓存与数据处理

临时表的魔力:SQL中的快速缓存与数据处理 在数据库的世界中,临时表是一种特殊的表,它在会话期间或事务中存在,用于存储临时数据。临时表对于执行复杂的查询、数据转换和分析等任务至关重要。本文将深入探讨SQL中的临时表,包括它们的定义、使用场景以及如何高效地使用它们。 一、临时表简介 什么是临时表? 临时表是数据库中的一个表,它仅在当前会话或当前事务中可见,当会话结束或事务提交时,临时表及其数据

【c++】 如何写一个调式工具类来临时查看变量值

介绍: 这个函数中设计了一个类Debugger,这个类提供了一个方法show,可以将一个变量打印在控制台,只要输入变量名就可以了,并且它可以自动匹配数据类型,通过重载匹配不同的参数。 完整代码: #include <iostream>#include <string> // 包含对std::string的支持class Debugger {private:int num;bool f