题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5159

题目大意是就是n个人进行两两的比赛,胜一局得A分,平局B分,败局C分。

然后取前m名入围,求入围的人最小的可能分数以及被淘汰的人的最大的可能分数。

这题首先可以想到的是胜A负C和胜C负A的情况是一模一样的。

所以可以先考虑让A大C小。

然后开始分情况讨论:

(1)B最小

1·这种情况下全部平局的话,能让入围的人分数最小。

2·然后需要考虑被淘汰的人的最大的可能分数:

必然将这些人分成m+1+n-m-1

由于要让这个’1’的分数尽可能大,自然考虑让n-m-1个人全部负场淘汰。

这样前面m+1个人都先得到a*(n-m-1)分。

然后需要让这个’1’尽可能大的话,首先他可以和m其中一半的人打胜场,和另一半的人打负场,这比打平局合算。然后这一半的人再胜另一半的人,这种情况所有人分数平衡。

此时又得到m/2*(a+c)分。

最后如果m是奇数,那么最后一场打负场。

这样做,因为’1’最多只能胜m个人里面一半的人,否则他肯定不会是最后一名。

所以中间打一半胜一半负,而且最后m%2那一局不能胜。

此外c>b,所以考虑m%2那场负。

(2)B最大

1·这种情况下全部平局的话,能让被淘汰的人的分数最大。

2·然后需要考虑围的人最小的可能分数;

必然将这些人分成m-1+1+n-m

由于要让这个’1’的分数尽可能小,自然考虑让m-1个人全部胜场入围。

这样前面n-m+1个人都先得到c*(m-1)分。

然后需要让这个’1’尽可能小的话,首先他可以和n-m其中一半的人打胜场,和另一半的人打负场,这比打平局分数少。

此时又得到(n-m)/2*(a+c)分。

最后如果n-m是奇数,那么最后一场打胜场。

这样做,因为’1’最多只能负m个人里面一半的人,否则他肯定不会是第一名。

所以中间打一半胜一半负,而且最后(n-m)%2那一局不能负。

此外a<b,所以考虑(n-m)%2那场胜。

(3)剩余情况中2*b < a+c的:

为什么考虑这两者的关系,因为上面的讨论已经发现了微妙的联系。

1·考虑围的人最小的可能分数;

必然m-1+1+n-m

然后让前面的m-1个人都胜场入围,那么必然’1’首先需要败m-1场。

然后他需要胜过至少(n-m)里面的一半人,这种情况下由于一开始的2*b < a+c,他选择平局分数更小。

自然最后如果多一场选择平局,而不选择胜局。

2·考虑被淘汰的人的最大的可能分数:

自然需要先胜(n-m-1)个人,因为他们全部负场。

然后他跟前面的人打一半胜一半负,因为2*b < a+c。

最后多的一场m%2打平局,否则他将胜过一半人。

(4)最后一种情况和(3)类似了。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <string>
#include <queue>
#define LL long long
#define MOD 1000000007 using namespace std; int n, m, a, b, c;
LL mi, ma; void input()
{
scanf("%d%d", &n, &m);
scanf("%d%d%d", &a, &b, &c);
if (a < c) swap(a, c);
} void work()
{
if (b < a && b < c)
{
mi = (LL)b*(n-);
ma = (LL)a*(n-m-);
ma += (LL)m/*(a+c);
ma += (LL)c*(m%);//
return;
}
if (b > a && b > c)
{
ma = (LL)b*(n-);
mi = (LL)c*(m-);
mi += ((LL)n-m)/*(a+c);
mi += (LL)a*((n-m)%);//
return;
}
if (*b < a+c)
{
mi = (LL)c*(m-);
mi += ((LL)n-m)*b; ma = (LL)a*(n-m-);
ma += (LL)m/*(a+c);
ma += (LL)b*(m%);//
return;
}
else
{
mi = (LL)c*(m-);
mi += ((LL)n-m)/*(a+c);
mi += (LL)b*((n-m)%);// ma = (LL)a*(n-m-);
ma += (LL)m*b;
return;
}
} int main()
{
//freopen("test.in", "r", stdin);
int T;
scanf("%d", &T);
for (int times = ; times <= T; ++times)
{
input();
work();
printf("Case #%d: ", times);
printf("%lld %lld\n", ma, mi);
}
return ;
}

ACM学习历程—UVALive 7147 World Cup(分类讨论 && 贪心)的更多相关文章

  1. UVALive 7147 World Cup(数学+贪心)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  2. ACM学习历程—FZU2195 检查站点(树形DP || 贪心)

    Description 在山上一共有N个站点需要检查,检查员从山顶出发去各个站点进行检查,各个站点间有且仅有一条通路,检查员下山前往站点时比较轻松,而上山时却需要额外的时间,问最后检查员检查完所有站点 ...

  3. ACM学习历程—FZU 2144 Shooting Game(计算几何 && 贪心 && 排序)

    Description Fat brother and Maze are playing a kind of special (hentai) game in the playground. (May ...

  4. ACM学习历程—HDU 4726 Kia's Calculation( 贪心&&计数排序)

    DescriptionDoctor Ghee is teaching Kia how to calculate the sum of two integers. But Kia is so carel ...

  5. UVaLive 6862 Triples (数学+分类讨论)

    题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数 ...

  6. AtCoder Beginner Contest 173 E Multiplication 4 分类讨论 贪心

    LINK:Multiplication 4 害怕别人不知道我有多菜 那就上张图: 赛时 太慌了 (急着AK 题目不难却暴露我的本性 根本不思考无脑写 wa了还一直停不下来的debug 至少被我发现了1 ...

  7. ACM学习历程—CodeForces 590A Median Smoothing(分类讨论 && 数学)

    题目链接:http://codeforces.com/problemset/problem/590/A 题目大意是给一个串,头和尾每次变换保持不变. 中间的a[i]变成a[i-1],a[i],a[i+ ...

  8. 完成了C++作业,本博客现在开始全面记录acm学习历程,真正的acm之路,现在开始

    以下以目前遇到题目开始记录,按发布时间排序 ACM之递推递归 ACM之数学题 拓扑排序 ACM之最短路径做题笔记与记录 STL学习笔记不(定期更新) 八皇后问题解题报告

  9. ACM学习历程—HDU 5512 Pagodas(数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5512 学习菊苣的博客,只粘链接,不粘题目描述了. 题目大意就是给了初始的集合{a, b},然后取集合里 ...

随机推荐

  1. spring;maven;github;ssm;分层;timestamp;mvn;

    [说明]本来还想今天可以基本搭建一个合适的ssm环境呢,结果发现,,太特么复杂了,网上的例子有好多,看了好多,下面的评论或多或少都有说自己运行产生问题的,搞的我也不敢好好下载运行 [说明]没办法,将目 ...

  2. 大数据学习系列(5)-- 局域网yum仓库搭建

    https://www.cnblogs.com/nulige/p/6081192.html

  3. wcf利用IDispatchMessageInspector实现接口监控日志记录和并发限流

    一般对于提供出来的接口,虽然知道在哪些业务场景下才会被调用,但是不知道什么时候被调用.调用的频率.接口性能,当出现问题的时候也不容易重现请求:为了追踪这些内容就需要把每次接口的调用信息给完整的记录下来 ...

  4. 启动/关闭Spring boot服务脚本

    启动Spring boot服务脚本 #!/bin/bash cd /test java -jar test.jar &> ./test.log & echo "成功&q ...

  5. Linux项目部署发布

    Linux项目部署发布 1.部署环境准备,准备python3和虚拟环境解释器,virtualenvwrapper pip3 install -i https://pypi.douban.com/sim ...

  6. Linux软件包分类

    源代码包 优点: 1.给你的就是源代码 2.可以修改源代码 3.可以自由选择所需的功能 4.软件是在自己电脑上编译安装,所以更加稳定高效 5.卸载方便(直接删了你安装软件的那个目录就好了) 缺点: 1 ...

  7. linux c编程:Posix共享内存区

    Posix共享内存区:共享内存是最快的可用IPC形式.它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存.如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存区映 ...

  8. C++学习笔记30,指针的引用(2)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guang_jing/article/details/32910093 能够创建不论什么类型的引用,包 ...

  9. Django模型系统——ORM

    一.概论 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描 ...

  10. 《程序员代码面试指南》第三章 二叉树问题 Tarjan算法与并查集解决二叉树节点间最近公共祖先的批量查询问题

    题目待续.... Tarjan算法与并查集解决二叉树节点间最近公共祖先的批量查询问题 java代码