首页 > 其他分享 >洛谷题单指南-暴力枚举-P2392 kkksc03考前临时抱佛脚

洛谷题单指南-暴力枚举-P2392 kkksc03考前临时抱佛脚

时间:2024-02-02 14:37:51浏览次数:30  
标签:题目 P2392 int 洛谷题 元素 sum2 sum1 len kkksc03

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

题意解读:由于可以同时计算两道同一科的题目,只需要把某一科题目分两堆,使得两堆总时长之差最小,时长较大的一堆就是完成这一科的最短时间。

解题思路:

既然直到了要把一科题目分两堆,关键是如何分堆呢?

比较容易犯的错是用贪心来解题:把一科题目按时长排序,从小到大取出放入一堆,剩余的规到另一堆,计算两堆之差最小的点。

贪心法的问题很容易举出反例,比如某一刻题目时长为:1、3、9、11,如果按此方法,得到最短时长为13,而实际是1+11 -(3+9)之差最小,最短时长应该是12。

既然贪心不好使,就直接使用枚举子集的方式,对于某一科s个题目,每一道题目选或者不选,来划分成两组,计算两组和的差值,取差值最小的一组和作为最短时长。

前面讲过,枚举子集可以采用二进制法,也可以使用DFS,这里采用二进制法。

100分代码:

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

const int N = 25;

int s1, s2, s3, s4;
int a[N], b[N], c[N], d[N];

//枚举所有的子集,计算子集和与剩余元素和之差的绝对值最小时,较大的那一组元素和
int gettime(int e[N], int len)
{
    int res = 0, minx = 2e9;
    for(int i = 0; i < pow(2, len); i++) // 对于长度为len的数组,从中选数的方案是0 ~ 2^len - 1对应的二进制,1表示选,0表示不选
    {
        int sum1 = 0, sum2; //sum1表示选择的元素之和,sum2表示剩余元素之和
        for(int j = 0; j < len; j++) //遍历每一个二进制位
        {
            if(i >> j & 1) //如果第j+1个二进制位是1
            {
                sum1 += e[j + 1]; //选择第j+1个数
                sum2 = e[0] - sum1; //计算剩余元素之和
                if(abs(sum1 - sum2) < minx) 
                {
                    minx = abs(sum1 - sum2); //记录选择元素和与剩余元素和之差绝对值的最小值
                    res = max(sum1, sum2); //当两组和相差最小时,较大的数即为答案
                }
            }
        }
    }
    return res;
}

int main()
{
    cin >> s1 >> s2 >> s3 >> s4;
    for(int i = 1; i <= s1; i++) 
    {
        cin >> a[i];
        a[0] += a[i]; //a[0]是元素之和
    }
    for(int i = 1; i <= s2; i++) 
    {
        cin >> b[i];
        b[0] += b[i]; //b[0]是元素之和
    }
    for(int i = 1; i <= s3; i++) 
    {
        cin >> c[i];
        c[0] += c[i]; //c[0]是元素之和
    }
    for(int i = 1; i <= s4; i++) 
    {
        cin >> d[i];
        d[0] += d[i]; //d[0]是元素之和
    }
    
    cout << gettime(a, s1) + gettime(b, s2) + gettime(c, s3) + gettime(d, s4);

    return 0;
}

 

标签:题目,P2392,int,洛谷题,元素,sum2,sum1,len,kkksc03
From: https://www.cnblogs.com/jcwy/p/18003097

相关文章

  • 洛谷题单指南-暴力枚举-P3799 妖梦拼木棒
    原题链接:https://www.luogu.com.cn/problem/P3799题意解读:要选四根木棒拼成等边三角形,必然有两根长度相等,其余两根长度之和等于前两根解题思路:木棒总数最大100000,每根最长5000,因此通过枚举其中两根木棒的长度,计算出另外两根的长度,通过各个长度的木棒数进行选择。设数组h[n]保......
  • 洛谷题单指南-暴力枚举-P1149 [NOIP2008 提高组] 火柴棒等式
    原题链接:https://www.luogu.com.cn/problem/P1149题意解读:计算符合A+B=C时,火柴棍数量正好等于n,可以采用枚举A、B,然后计算出C,根据A、B、C计算出所有火柴棍数量,再加上4根加号、等号的,如果与n相等,即为一种合法等式。解题思路:题目的关键在于枚举A、B时,最大值的设定,不能超时。分析......
  • 洛谷题单指南-暴力枚举-P1217 [USACO1.5] 回文质数 Prime Palindromes
    原题链接:https://www.luogu.com.cn/problem/P1217题意解读:本题要找[a,b]范围内的所有回文质数,千万不要被题目提示所干扰,如果按照提示先产生各个长度的回文数,再依次判断是否是素数,程序写起来比较繁琐,需要根据a、b的长度,写8个判断是否产生1~8位回文数,最后做素数判断。换一个思路......
  • 洛谷题单指南-暴力枚举-P3654 First Step (ファーストステップ)
    原题链接:https://www.luogu.com.cn/problem/P3654题意解读:在r*c矩阵中,找连续k个.的总数。解题思路:本题直接枚举即可,在每一行中,以每一列为起点,连续判断k个元素,如果全为'.',则方案数加1在每一列中,以每一行为起点,连续判断k个元素,如果全为'.',则方案数加1注意:如果k=1,只有一个人......
  • 洛谷题单指南-暴力枚举-P3392 涂国旗
    原题链接:https://www.luogu.com.cn/problem/P3392题意解读:此题枚举白、蓝、红所有可能的行数组合,依次逐行判断每个方格,是否需要染色,计算最少的染色次数即可。解题思路:总行数是n,先考虑白色,第一行必是白色,最后一行必是红色,至少有一行蓝色,因此白色行数的范围是1~n-2再考虑蓝......
  • 洛谷题单指南-暴力枚举-P1088 [NOIP2004 普及组] 火星人
    原题链接:https://www.luogu.com.cn/problem/P1088题意解读:火星人的手指可以通过全排列来表示数字,全排列由小到大的顺序即为表示的数字大小,题目可以转化为:给定按顺序全排列中的某一个排列,求往后数m个排列的内容。解题思路:此题与经典全排列问题的差异在于,需要从指定一个排列开......
  • 洛谷题单指南-暴力枚举-P1706 全排列问题
    原题链接:https://www.luogu.com.cn/problem/P1706题意解读:n个数全排列问题,本质上,给定n个空位,枚举每个能填入空位的数,依次填入,每个数只能填一次。解题思路:如何填入n个数呢,可以借助于递归,流程如下:dfs(填入第k个数){如果已经填满n个数输出结果返回......
  • 洛谷题单指南-暴力枚举-P1157 组合的输出
    原题链接:https://www.luogu.com.cn/problem/P1157题意解读:在1~n的数中挑选r个,有多少种组合,与P1036类似,有两种做法:二进制法、DFS,下面给出DFS版的代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=25;intn,r;intt[N];voiddfs(intk){......
  • 洛谷题单指南-暴力枚举-P1036 [NOIP2002 普及组] 选数
    原题链接:https://www.luogu.com.cn/problem/P1036题意解读:题目即要在n个数中,枚举出所有的子集,当子集中数字个数刚好为k时,求和,判断是否是素数。解题思路:方法一:二进制法通过二进制法,可以枚举一个集合中所有元素“选”或者“不选”的情况,用二进制1表示选该元素,二进制0表示不选。......
  • 洛谷题单指南-暴力枚举-P1618 三连击(升级版)
    原题链接:https://www.luogu.com.cn/problem/P1618题意解读:枚举所有三位数的组合情况,判断是否符合比例。解题思路:方法一:枚举第一个数根据题意,目的是寻找三个符合比例的三位数,可以直接枚举第一个,最小是123,最大是987设第一个数为x,三个数的比例关系是a:b:c设另外两个数为y,z那么,根......