拔河比赛

描述 Description
一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近。
输入格式 Input Format
输入数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight<=450)。
输出格式 Output Format
输出数据应该包含两个整数:分别是两个组的所有人的体重和,用一个空格隔开。注意如果这两个数不相等,则请把小的放在前面输出。
样例输入 Sample Input

3
100
90
200

样例输出 Sample Output

190 200

这道题关键在于拔河的人数分为两个组,并且其中一个组的数量是可以确定的。数量就是(n+1)/2,这个首先直接不用再考虑n是奇数还是偶数。之后就是动态转移方程。大体的思路就是通过动归可以枚举到前(n+1)/2个人的质量之和所能达到的所有值。在这之后就容易找出差值最小的值了。但是,这个方程转移和之前的有些不一样,这个因为是要考虑所有的情况,所以用三维数组是十分麻烦的,这就需要我们进行降维,使用二维数组的话就可以递推出所有的情况。

假设f[k][j]表示第一组有i个人时质量之和为j能否达到,存入的值为1或者0;

伪代码就是:

for(int i=1;i<=n;i++)   //表示第i个人

for(int j=s[i];j>=a[i];j--)    //s[i]存入的时到第i个人为止,质量之和;a[i]存的是第i个人的质量

for(int k=1;k<=(n+1)/2;k++)

f[k][j]=max(f[k-1][j-a[i]],f[k][j])

j从s【i】到a【i】,当j-a【i】后就可以把使用第i个人之前所有可能达到的质量都枚举到,然后k从1开始,把所有可能的人数列出来,这样就可以保证所有的可能不会遗漏;

下面就是输出问题了,这个十分简单。我们想要找出差值尽可能小的值,所有求出所有质量的平均值。

for(int i=(s[n]+1)/2;i>=0;i--)

if(f[(n+1)/2][i]==1||f[(n-1)/2][i]==1)
{
if(i*2>s[n])
i=s[n]-i;
cout<<i<<‘ ‘<<s[n]-i<<endl;
return 0;
}

原文地址:https://www.cnblogs.com/kgxw0430/p/8410839.html

时间: 2024-12-28 21:31:09

拔河比赛的相关文章

codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品

1959 拔河比赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近. 输入描述 Input Description 数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight

codevs1959拔河比赛(二维费用背包)

1959 拔河比赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近. 输入描述 Input Description 数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight<=450).

1959 拔河比赛

1959 拔河比赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近. 输入描述 Input Description 数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight

c 指针 及其位运算循环移动拔河比赛问题代码

week_2_day1_7.7 周一//用字符数组 来实现 字母大小写转换#include<stdio.h>void desc( char *a ,int n){    char  *i = a;    int x = 0 ;    for ( x = 0; x < n ;x ++ )    {                    if ( *i  >= 97 )                        *i-=32;        i++;    }}int main(v

数据库相关

[数据库系统概述]常用的数据库有MySql.oracle等.不同数据库都支持sql标准,并且不同数据库在sql标准的基础上进行了一些扩充.对于数据库的学习包括:sql>过程.触发器等内容,其中重要程度如下:sql>过程.触发器等oracle数据库: 1.oracle的开发部分,包含两个部分:sql+plsql编程 2.oracle管理部分,数据库配置和运行维护[oracle简介]oracle默认有sys和system两个用户,其中 sys: 超级管理员,拥有操作数据库的所有权限 system:

POJ 2576 Tug of War 随机算法

原题地址:http://poj.org/problem?id=2576 Tug of War Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8525   Accepted: 2320 Description A tug of war is to be arranged at the local office picnic. For the tug of war, the picnickers must be divide

【学生必备求职指南】好简历是怎样炼成的?毕业生简历实例点评版 转载

作为应届毕业生,简历中应当包括的重点内容基本出现,层次比较清晰,且对自己从事过的实践工作内容进行了较详尽的描述,同时有意识地给出了通过实践自己得到的收获.但总体篇幅过长,部分内容的逻辑性和展现方式有待改进. 撰写简历主要原则:1.在能够突出展现自己的工作履历.技能和优势的前提下,尽可能缩短篇幅(一页最佳),冗长的简历会冲淡重点,不易被HR所青睐.2.撰写简历前,尽可能通过各种途径了解职位所需的经验.素质和技能,并据此有针对性地制作相应的简历,只有这样才能让HR在"scan"简历的过程中

上大学了如何找到一台适合自己的电脑呢?

中考高考都结束了,暑假开始了,你还在为选择用什么配置的电脑发愁吗?现在小信告诉你,选择电脑时要注意那些事项.记得点击上面蓝色字体关注我们噢,每天都会免费推送最新科技资讯.一.CPU核心越多速度越快! 不错,人越多力量越大,但如果拔河比赛,8个普通人和4个大力士比赛,后者胜利. 实际对比: intel i3-4160(双核四线程) CPU性能超过 AMD X4 860K(四核四线程) intel i5-4590(四核四线程) CPU性能超过 AMD FX8320(八核八线程) 这是新人选择电脑最大

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734