2019暑假多校训练第八场 | 部分题解

南京大学的咖啡鸡出的题目

题解也是全英的555

贡献率≈0

好好补题鸭!

再一次感叹 川酱 和 zkx 的聪明才智!!!

题解链接:https://pan.baidu.com/s/1wWMZm9izwx1LqWrLJpjdyg 提取码: jq5r 复制这段内容后打开百度网盘手机App,操作更方便哦

 

09 Calabash and Landlord

HDU 6656 分类讨论+判断

题目大意:给两个矩形,求两个矩形把平面分成了多少份

这道题重新写了一份题解 https://blog.youkuaiyun.com/OneLine_/article/details/99642331

我的思想是 暴力判断…… 但是判断是在太多辽 就放弃辽 卒orz

zkx的思想是 先判断出 两个矩形的相交得到的矩形 然后判断 它把原来的矩形1分成了多少份 + 把原来的矩形2分成了多少份 (牛逼嗷

川酱的思想是 先离散化两个矩形 然后求10*10的图中有多少连通块……orz

(我好菜啊…… 下面是zkx的思想做的)

如何求相交矩形参考:https://www.cnblogs.com/yjiyjige/archive/2013/04/20/3032559.html

#include <stdio.h>
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct Rect {
    int startX, endX, startY, endY;
};
Rect RectH(Rect r1, Rect r2)
{
    Rect m;
    m.startX = r1.startX < r2.startX ? r1.startX : r2.startX;
    m.endX = r1.endX > r2.endX ? r1.endX : r2.endX;
    m.startY = r1.startY < r2.startY ? r1.startY : r2.startY;
    m.endY = r1.endY > r2.endY ? r1.endY : r2.endY;
    return m;
}
Rect RectArea(Rect r1, Rect r2)
{
    Rect mm = RectH(r1, r2);
    Rect both ;
    both.startX = r1.startX == mm.startX ? r2.startX : r1.startX;
    both.endX = r1.endX == mm.endX ? r2.endX : r1.endX;
    both.startY = r1.startY == mm.startY ? r2.startY : r1.startY;
    both.endY = r1.endY == mm.endY ? r2.endY : r1.endY;
    return both;
}
int run(Rect r1, Rect r2)
{
    if (r1.startX != r2.startX || r1.endX != r2.endX || r1.endY != r2.endY || r1.startY != r2.startY) {
        return 0;
    } else {
        return 1;
    }
}
int cmp(Rect r1, Rect r2)
{
    if (run(r1, r2) == 1) {
        return 1;
    }
    int lenx1 = r1.endX - r1.startX;
    int lenx2 = r2.endX - r2.startX;
    if (lenx1 == lenx2) {
        if (r1.startY == r2.startY || r1.endY == r2.endY) {
            return 2;
        } else {
            return 3;
        }
    } else {
        int leny1 = r1.endY - r1.startY;
        int leny2 = r2.endY - r2.startY;
        if (leny1 == leny2)
            if (r1.startX == r2.startX || r1.endX == r2.endX) {
                return 2;
            } else {
                return 3;
            }
        else {
            return 2;
        }
    }
}
int main()
{
    int t;
    scanf("%d", &t);
    while (t--) {
        Rect r1, r2;
        scanf("%d%d%d%d", &r1.startX, &r1.startY, &r1.endX, &r1.endY);
        scanf("%d%d%d%d", &r2.startX, &r2.startY, &r2.endX, &r2.endY);
        Rect m = RectArea(r1, r2);
//        printf("%d %d %d %d ***\n", m.startX, m.startY, m.endX, m.endY);
        if (m.startX >= m.endX || m.startY >= m.endY) {
            printf("3\n");
            continue;
        }
        if (run(r1, r2) == 1) {
            printf("2\n");
            continue;
        }
//        printf("%d %d ", cmp(m, r1), cmp(m, r2));
        int ans = cmp(m, r1) + cmp(m, r2);
        printf("%d\n", ans);
    }
    return 0;
}

11 Roundgod and Milk Tea

HDU 6667 贪心思想

题目大意:给出t组样例,每组样例第一行是 班级数量n,接下来n 行 表示每个班的人数和制作的奶茶数量,

要求自己班的人不能喝自己班制作的奶茶,问 最多有多少人喝到了奶茶?

最开始我们想的是 制作奶茶最多的班做奶茶给其他人少的班的人喝,……但是可能存在 有一个班正好是中间那个制作奶茶给别班的人喝,这个班就是他们自己 就emm有点混乱

下面的代码是 川酱的方法做的

如果人数最多的班和制作奶茶最多的班是同一个

答案就是 总人数 - 最多人数的班 +  总奶茶数 - 最多奶茶的班

否则就是 min(总奶茶数,总人数) 

#include <stdio.h>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a[1000005], b[1000005];
int main()
{
    int t;
    scanf("%d", &t);
    while (t--) {
        int n;
        scanf("%d", &n);
        ll sum = 0, num = 0;
        ll maxa = 0, maxb = 0, x = 0, y = 0;
        for(int i = 0; i < n; i++) {
            scanf("%lld", &a[i]);
            scanf("%lld", &b[i]);
            sum += a[i];
            num += b[i];
            if (a[i] > maxa) {
                maxa = a[i];
                x = i;
            }
            if (b[i] > maxb) {
                maxb = b[i];
                y = i;
            }
        }
        // printf("%d %d ** \n",sum,num);
        if (x == y && (maxa > num - b[x]) && (maxb > sum - a[x])) {
            printf("%lld\n", sum - a[x] + num - b[x]);
        } else {
            printf("%lld\n", min(sum, num));
        }
    }
    return 0;
}

PS:据说这个代码会被数据hack掉 应该是还有少讨论的情况存在 待改进。。。

芳姨的博客:https://blog.youkuaiyun.com/renfang_kkkkkss/article/details/99600681

大白的博客:https://blog.youkuaiyun.com/baymax__dabai/article/details/99606714

以供参考

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值