HDU 5874 Friends and Enemies(二分图思想)——2016 ACM/ICPC Asia Regional Dalian Online

此文章可以使用目录功能哟↑(点击上方[+])

 HDU 5874 Friends and Enemies

Accept: 0    Submit: 0
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

 Problem Description

On an isolated island, lived some dwarves. A king (not a dwarf) ruled the island and the seas nearby, there are abundant cobblestones of varying colors on the island. Every two dwarves on the island are either friends or enemies. One day, the king demanded that each dwarf on the island (not including the king himself, of course) wear a stone necklace according to the following rules:

For any two dwarves, if they are friends, at least one of the stones from each of their necklaces are of the same color; and if they are enemies, any two stones from each of their necklaces should be of different colors. Note that a necklace can be empty.

Now, given the population and the number of colors of stones on the island, you are going to judge if it's possible for each dwarf to prepare himself a necklace.

 Input

Multiple test cases, process till end of the input. 

For each test case, the one and only line contains 2 positive integers M,N (M,N<2^31) representing the total number of dwarves (not including the king) and the number of colors of stones on the island.

 Output

For each test case, The one and only line of output should contain a character indicating if it is possible to finish the king's assignment. Output ``T" (without quotes) if possible, ``F" (without quotes) otherwise.

 Sample Input

20 100

 Sample Output

T

 Problem Idea

解题思路:

【题意】
有M个人,N种颜色的石头若干

M个人中每两个人,不是朋友就是敌人
现在他们每个人都要用石头串一条项链,要求如下: 
1.互为朋友的俩人的项链至少有一颗相同颜色的石头
2.互为敌人的俩人没有相同颜色的石头
3.项链可以是空的,即不串石头,这种情况下,空项链的人与其他任何人都是敌人 
问N种颜色的石头能不能满足这随机关系的M个人

【类型】
二分图思想
【分析】
比赛的时候,比较蠢,看AC的人用时和内存都比较小,就随意画画,找到了规律

但实际上,此题蕴含着二分图的思想

问能不能满足随机关系,那肯定是要和最坏的情况比较

也就是求最坏的情况下最少需要多少种颜色的石子
然后根据两个人的关系只有朋友和敌人这点

就可以想象成一个二分图,分别在两侧的人是朋友,同侧的是敌人

这样的话,就是求一个完全二分图的边数有多少就行了   
因为总共M个人,想要边数尽可能多,所以尽量均分,左右两边人数最接近就行了
这样的话,边数就是(m-m/2)*(
m/2)
之后再跟N比较一下就可以了

【时间复杂度&&优化】
O(1)

题目链接→HDU 5874 Friends and Enemies

 Source Code

/*Sherlock and Watson and Adler*/
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<cmath>
#include<complex>
#include<string>
#include<algorithm>
#include<iostream>
#define eps 1e-9
#define LL long long
#define PI acos(-1.0)
#define bitnum(a) __builtin_popcount(a)
using namespace std;
const int N = 100005;
const int M = 20005;
const int inf = 1000000007;
const int mod = 1000000007;
int main()
{
    __int64 m,n;
    while(~scanf("%I64d%I64d",&m,&n))
        if(n>=(m-m/2)*(m/2))
            puts("T");
        else
            puts("F");
    return 0;
}
菜鸟成长记

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值