ランダムチーム------貪欲

各チームは、少なくとも一人の参加者を持っているように、n個の競争の参加者は、いくつかの方法で、m個のチームに分けました。大会後は同じチームからの参加者の各ペアは友達になりました。

あなたの仕事は最小と競争の末までに形成された可能性があり、友人のペアの最大数を見つけるプログラムを書くことです。

入力は、
参加者の数と、それぞれのチームの数-入力の唯一のラインは、単一のスペース(1≤M≤N≤109)によって分離された2つの整数nおよびmが、含まれています。

出力
はそれぞれの友人や友人のペアの最大可能な数のペアの最小可能数-出力の唯一のラインは二つの整数Kminとし、KMAXが含まれている必要があります。


入力
5 1
出力
10 10

入力
3 2
出力
1 1

入力
6 3
出力
3 6


最初のサンプルでは、すべての参加者は1つのチームに、その友人のちょうど10組が存在します取得します。

第二のサンプルでは任意の可能な配置で1つのチームは常に2人の参加者がありますし、他のチームは、常に一人の参加者があります。このように、友人のペアの数は常に1に等しくなります。

参加者は1,1及び4人のチームに分割した場合、参加者は、2人からなるチームに分割した場合に達成することができ、新たに形成された友人の第三のサンプルの最小数は、最大数を達成することができます。

問題の意味

少なくともまでのチームに割り当てられたN Mの個々の、良い友達になり、各チームのチームメイト、良い友達それぞれがいくつあるか尋ねます

問題解決のためのアイデア

当初はまた、自分自身を発見したデータのいくつかのセットがテストされた場合に1人のチームに集中し、他のチームは、人にまで対数にこの場合の良い友人を入れている見つけ、彼らはいくつかの例を疑い、アイデアを欠い最小数の言葉共有し、各チーム
間違いやすいポイント:
長い長いへのデータ範囲ということに注意してください
を見ては、第一または第一出力の最大出力分では、私は後方欺い...私はそれを行います。この愚かな過ちを、WAいくつかの髪

コードの実装

#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
	long long n, m, max = 0, min = 0;
	cin >> n >> m;
	if (m == 1)//一队的话最大值最小值相等
	{
		max = n * (n - 1) / 2;
		cout << max << " " << max << endl;
		return 0;
	}
	else
	{
		long long t = n - m + 1,x = n / m, y = n % m;
		max = t * (t - 1) / 2;
		min = (m - y) * x*(x-1)/2 + y * x*(x+1)/2;
		cout << min << " " << max << endl;
	}
	return 0;
}

コードワードは、それが去るように、簡単ではありません
〜デリゲート賞賛を、香りを手

公開された26元の記事 ウォン称賛30 ビュー2419

おすすめ

転載: blog.csdn.net/SDAU_LGX/article/details/104931041