HDU 6195 2017沈阳网络赛 公式

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

题意:有M个格子,有K个物品。我们希望在格子与物品之间连数量尽可能少的边,使得——不论是选出M个格子中的哪K个,都可以与K个物品恰好一一匹配。

解法:从样例猜出答案应该是K*(M-K+1)。从这个样例可以找到合法的解决方案。每个物品,都要向(M - K + 1)个格子连去一条边,我们会丢弃M - K个格子,但总会剩下一个格子是与这个物品连边的

我们强制这样连边1 -> [1, M - K + 1]   2 -> [2, 1 + M - K + 1]   3 -> [3, 2 + M - K + 1]  K -> [K, M]  这样不论选哪些格子,第一个物品总是能匹配第一个格子,第二个物品总是能匹配第二个格子…… 所以总能合法匹配!

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
    LL M,K;
    while(~scanf("%lld %lld", &M,&K))
    {
        LL ans = K*(M-K+1);
        printf("%lld
", ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/spfa/p/7505007.html