南京大学的咖啡鸡出的题目
题解也是全英的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
以供参考