排位赛二H. I Would Walk 500 Miles

题目

Farmer John想要将他的编号为 1…N的N头奶牛( N≤7500 )分为非空的 K 组( 2≤K≤N ),使得任意两头来自不同组的奶牛都需要走一定的距离才能相遇。奶牛 x 和奶牛 y(其中 1≤x<y≤N )愿意为了见面走(2019201913x+2019201949y)mod2019201997 英里。
给定一个将 N 头奶牛分为 K 个非空小组的分组方案,令 M 为任意两头来自不同组的奶牛愿意为了见面行走的英里数的最小值。为了测试奶牛们相互之间的忠诚度,Farmer John想要将 N 头奶牛以最佳的方式分为 K组,使得 M尽可能大。

解法

令 t = 2019201997,那么(2019201913x+2019201949y)mod2019201997
就等价于 ( (t-84)x + (t-48y) + t ) mod t
化简一下就是 -84x - 48y + t
然后就开始贪心了,奶牛为了使得这个值最小,那么x, y肯定会尽可能的大,所以y必定等于n(-84n 比-48n小),这个时候奶牛就想用第n-1头了,但是我们可以把这头奶牛和n放在同一组,这样n-1就不能用了(有点坏坏的感觉),然后奶牛就想用n-2…依次类推,当我们处理第k-1头奶牛的时候,我们就放不进去了,因为剩下的k-2头奶牛是组不了k-1组的,所以k-1的奶牛就必须放在外面,奶牛得而用之,答案就是 (-84*(k-1) - 48*n + mod) % mod;

代码

#include <iostream>
#include <cmath>
#include <queue>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;

const int mod = 2019201997;
int main() {
	long long int n, k, ans;
	cin >> n >> k;
	ans = (-84*(k-1) - 48*n + mod) % mod;
	cout << ans;
	

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值