先讲1007,有m个人,n种石头,将n种石头分给m个人,每两个人之间要么是朋友关系,要么是敌人关系,朋友的话他们必须有一种相同颜色的石头,敌人的话他们必须所有石头的颜色都不相同。另外,一个人可以不拥有任何一种石头。求m个人的所有关系是不是都能用n种石头表示出来。比赛当时找的关系是n种石头可以表示n+1个人的关系。但是一直WA,因为考虑不周。

  我们考虑这样的一种情况,我们把人分为左边和右边两部分,每边的人里面都互相为敌人,同时左边的任意一个人和右边的任意一个人都是朋友。举个例子,左边有3人,右边两人。考虑左边第一人,他和右边每一个人都要有相同的至少一种石头,那么他至少要有两种石头,而左边的每一个人的每一个石头都不能一样,那么至少要有3*2=6种石头。通过这个例子我们就可以找出规律来了,总共需要的石头量为左右人数之积。

  那么问题就转化成了,将m个人分成两组,使得乘积最大(这是m个人下的最坏的情况,如果这个情况都能满足,那么其他情况也都能满足了)。显然,将m个人均分一下得到的乘积最大,那么答案就出来了。

  代码如下:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 using namespace std;
 5 typedef long long ll;
 6 
 7 int main()
 8 {
 9     int n,m;
10     while(scanf("%d%d",&n,&m)==2)
11     {
12         int l = n/2;
13         int r = n-n/2;
14         if(1LL*l*r > m) puts("F");
15         else puts("T");
16     }
17 }
View Code

相关文章:

  • 2021-12-25
  • 2021-07-28
  • 2022-01-10
  • 2021-06-03
  • 2021-11-13
  • 2022-12-23
  • 2021-09-08
  • 2022-12-23
猜你喜欢
  • 2022-01-16
  • 2022-01-31
  • 2022-12-23
  • 2022-12-23
  • 2021-10-10
  • 2021-12-24
  • 2021-11-30
相关资源
相似解决方案