• 不是匹配


    时间限制:1000 ms  |  内存限制:65535 KB
    描述
     有N个人,N个活动, 每个人只会对2个或者3个活动感兴趣,
     每个活动也只有两个人或者三个人对它兴趣,每个人参加一个
     感兴趣的活动需要一天 ,且当天该活动被参加时,其他的人不能参加
     如果每个人都参加完自己有兴趣的活动,应当怎样安排使得所用总天数时间最短
    2<= N <=1000, 1<=m<=1000;

    输入
    一个数T 表示T 组数据
    每组一个N表示人数,编号1 -- N , 一个数 m ,接下来m 行每个两个数
    x,y, 表示第 x 个人对第y个活动感兴趣
    输出
    每组输出一个整数,表示最少天数
    样例输入
    1
    3 6 
    1 1 
    1 2 
    2 2
    2 3 
    3 1 
    3 3 
    样例输出

    2

    该题确实不是匹配题  可怜我用二分图做了半天

    题目中每个人只会对2个或3个活动感兴趣 并且每个活动也只有两个人或者三个人对它感兴趣 这是关键点   

    也就是说最多用3天就可以  让对三个活动感兴趣的人完成任务  或者是  完成三个人都有兴趣的活动

    举一道小学的题   :

    一个平底锅可以同时烙两张饼   每个饼正反两面都需要烙 每次烙一面需要1分钟    问你三个饼需要几分钟  最优的是3分钟

    第一次  1正2正  

    第二次 2反3正

    第三次 3反1反

    这个题思路跟这个一样  所以我们只要求出所有人中一个人需要参加的活动的最大数sum1和所有活动中被参加次数最大数sum2  在sum1和sum2中找出最大值即可

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    using namespace std;
    int sum1[1001],sum2[1001];
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--)
    	{
    		memset(sum1,0,sizeof(sum1));
    		memset(sum2,0,sizeof(sum2));
    		int n,m;
    		scanf("%d%d",&n,&m);
    		for(int i=0;i<m;i++)
    		{
    			int a,b;
    			scanf("%d%d",&a,&b);
    			sum1[a]++;
    			sum2[b]++;
    		}
    		int maxx=-1;
    		for(int i=1;i<=n;i++)
    		{
    			maxx=max(sum1[i],max(maxx,sum2[i]));
    		}
    		printf("%d
    ",maxx);
    	}
    	return 0;
    }
    


  • 相关阅读:
    51 数据中重复的数字
    64 数据流中的中位数
    79. Word Search
    93. Restore IP Addresses
    547. Friend Circles
    Epplus Excel 导入 MSSQL 数据库
    用来更新服务的bat 脚本
    ASP.Net MVC 引用动态 js 脚本
    8、结构的构造器应该显式调用!!!(坑)
    Task 线程重用导致等待!
  • 原文地址:https://www.cnblogs.com/kingjordan/p/12027043.html
Copyright © 2020-2023  润新知