T24759 Cup#182-5 平行分班II

模拟赛不会系列。。。

这道题要求最小的极差(所选元素相差的最大值),最小的最大,想到了二分。

但是我菜,找不到什么单调性。

看了标程,发现可以用堆来搞定。相关算法可以从P1631和P2085看到。

思路是将每一组分别排序,然后每组预先选取第1到第c[i]个。算出一个最初的ans。

然后可以每次更新答案,删除掉其中的最小值,插入下一个元素到堆里面去。同时维护新的ans。

更新到其中任意一组没有下一个的时候就break掉。然后输出ans即可。

代码:

#include<cstdio>
#include<queue>
#include<algorithm>

const int maxn = 100005, maxm = 1000005;

struct Nodes
{
    int val, belong;
    bool operator < (const Nodes &rhs) const
    {
        return val > rhs.val;
    }
} s[maxm];
int tot;
std::priority_queue<Nodes> q;

int m[maxn], c[maxn];
int start[maxn], end[maxn], l[maxn], r[maxn];
int pos[maxn];
int maxx;
int n, ans;
bool cmp(const Nodes x, const Nodes y)
{
    return x.val < y.val;
}
int read()
{
    int ans = 0, s = 1;
    char ch = getchar();
    while(ch > ‘9‘ || ch < ‘0‘){ if(ch == ‘-‘) s = -1; ch = getchar(); }
    while(ch >= ‘0‘ && ch <= ‘9‘) ans = (ans << 1) + (ans << 3) + ch - ‘0‘, ch = getchar();
    return s * ans;
}
int main()
{
    n = read();
    for(int i = 1; i <= n; i++)
    {
        m[i] = read(), c[i] = read();
        start[i] = tot + 1, end[i] = tot + m[i];
        for(int j = 1; j <= m[i]; j++)
        {
            s[++tot] = (Nodes){read(), i};
        }
    }
    for(int i = 1; i <= n; i++) std::sort(s + start[i], s + end[i] + 1, cmp);
    for(int i = 1; i <= n; i++)
    {
        for(int j = start[i]; j <= start[i] + c[i] - 1; j++)
        {
            q.push(s[j]);
            maxx = std::max(maxx, s[j].val);
        }
        pos[i] = start[i] + c[i] - 1;
    }
    ans = maxx - q.top().val;
    while(2333)
    {
        Nodes u = q.top(); q.pop();
        int i = u.belong;
        if(pos[i] == end[i]) break;
        q.push(s[++pos[i]]);
        maxx = std::max(maxx, s[pos[i]].val);
        ans = std::min(ans, maxx - q.top().val);
    }
    printf("%d\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Garen-Wang/p/9608910.html

时间: 2024-07-31 07:57:26

T24759 Cup#182-5 平行分班II的相关文章

1011 World Cup Betting (20 分)

1011 World Cup Betting (20 分) With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excited as the best players from the best teams doing battles for the World Cup trophy in South Africa. Similarly, football be

15: 幼儿园分班问题

15 幼儿园分班问题 作者: 朱凯 时间限制: 1S 章节: 分支结构 问题描述 : 某幼儿园只招收2至6岁的小孩.2.3岁入小班,4岁入中班,5.6岁入大班.给出一个孩子的年龄,请问他应该被分到什么班. 输入说明 : 你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据.每组输入数据占一行,其中只包含一个整数i(1≤i≤10),表示一个孩子的年龄.在行首和行尾没有多余的空格. 输出说明 : 对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端,例如你在Windows中启

力扣——分糖果 II

排排坐,分糖果. 我们买了一些糖果 candies,打算把它们分给排好队的 n = num_people 个小朋友. 给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n 颗糖果. 然后,我们再回到队伍的起点,给第一个小朋友 n + 1 颗糖果,第二个小朋友 n + 2 颗,依此类推,直到给最后一个小朋友 2 * n 颗糖果. 重复上述过程(每次都比上一次多给出一颗糖果,当到达队伍终点后再次从队伍起点开始),直到我们分完所有的糖果.注意,就算我们手中的剩下糖果数不

LeetCode 1103. Distribute Candies to People (分糖果 II)

题目标签:Math 题目让我们分发糖果,分的糖果从1 开始依次增加,直到分完. for loop可以计数糖果的数量,直到糖果发完.但是还是要遍历array 给people 发糖,这里要用到 index = (本轮分糖果的量 % people 的人数)糖果的数量从0 开始计数,这样的话,index 就会一直重复遍历 array,具体看code. Java Solution: Runtime:  1ms, faster than 90.53% Memory Usage: 33.8 MB, less

LeetCode——1103. 分糖果 II

排排坐,分糖果. 我们买了一些糖果 candies,打算把它们分给排好队的 n = num_people 个小朋友. 给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n 颗糖果. 然后,我们再回到队伍的起点,给第一个小朋友 n + 1 颗糖果,第二个小朋友 n + 2 颗,依此类推,直到给最后一个小朋友 2 * n 颗糖果. 重复上述过程(每次都比上一次多给出一颗糖果,当到达队伍终点后再次从队伍起点开始),直到我们分完所有的糖果.注意,就算我们手中的剩下糖果数不

第三次分班考试笔试总结

本题选择abcd都可以,location与locations都可以 2. 解析:spring在自动装配是默认情况下是no 不使用自动装配 而byName和byType需要制定autoweir属性,default 需要在beans根节点进行配置才可以 解析:spring自带事物管理器,不是由持久化框架提供  所以b选项错误 事物传播行为默认取值是required  所以c错误 解析:public *表示所有的返回值类型都可以进行匹配 所以b错误 解析:d选项在构造器既能创建完整合法的对象属于构造注

烧烤节代课教师分班的那个...

 http://www.17k.com//chapter/110440/20538051.html http://www.17k.com//chapter/110440/20538042.html http://www.17k.com//chapter/110440/20538030.html http://www.17k.com//chapter/110440/20538021.html http://www.17k.com//chapter/110440/20538013.html ht

分班考试题总结

1. 正确答案:D 2. 正确答案:C 扩展:关于视图 底层就是一堆查询的sql语句.视图是可以嵌套的 MySQL:视图 CREATE VIEW 视图名VW_XXX AS SELECT (列1,列2...) FROM TableName; 3. 正确答案:D 扩展:log4j 日志的级别 优先级:Fatal>error(错误)>warn(警告)>info(信息)debug(调试) 4. 正确答案:B C 扩展: 5. 正确答案:B D 扩展: 6. 正确答案: A D 扩展:注册/绑定事

Y2165终极分班考试题。

第一题答案:D 2.下面关于SQLServer中视图的说法错误的是:C 答案:视图是数据中存储的数据值得集合. 3.在JAVA中,关于日志记录工具log4j的描述错误的是:D 答案:log4j个输出级别优先为debug>info>wam>error>fatal. 4.Web容器处理JSP文件请求需要三个阶段,下列选项中说法错误的是:BD 答案:翻译阶段JAVA源代码会被编译成可执行的节码 执行阶段容器接受了客户端请求后,执行字节码文件并把处理结果反馈给客户端. 5. . 答案:BD