HDU

来源:互联网 发布:tplink路由器访客网络 编辑:程序博客网 时间:2024/06/16 22:43

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6106

题目大意:有n个班级,每个班级的人都可以选3门课,求这n个班级中选课最多的人数。

解题思路:因为每个人可以同时选择多门,所以直接用容斥原理,设课程编号为A,B,C,那么总人数为A+B+C-A∩B-A∩C-B∩C+A∩B∩C,因为有可能出现不合理的数据,所以画个三个圆圈的图,然后保证每个圆圈内部封闭区的人数大于等于0,详看代码。

AC代码:

#include<cstdio>#include<algorithm>using namespace std;int main(){    int t;scanf("%d", &t);    while (t--)    {        int n;scanf("%d", &n);        int mx = 0;        while (n--)        {            int a, b, c, ab, bc, ac, abc;            scanf("%d%d%d%d%d%d%d", &a, &b, &c, &ab, &bc, &ac, &abc);            if (a < (ab + ac - abc)) continue;            if (b < (ab + bc - abc)) continue;            if (c < (ac + bc - abc)) continue;            if (ab - abc < 0) continue;            if (ac - abc<0) continue;            if (bc - abc<0) continue;            if (abc < 0) continue;            int ans = a + b + c - ab - bc - ac + abc;            mx = max(ans, mx);        }        printf("%d\n", mx);    }}
原创粉丝点击