C. The Football Season

题目

题意:

    有n场比赛,赢了得d分,平局得w分,输了得0分。现在给你一个最后的得分,要求赢了多少场,平了多少场。
     1 n 1 0 12 , 0 p 1 0 17 , 1 d < w 1 0 5 1≤n≤10^{12},0≤p≤10^{17},1≤d<w≤10^5

分析:

    其实我们可以把胜场看成是平局再加上他们之间的差距,那么有解的情况下,就是分数减去差值必须是平局分数的整数倍。
    那么我们就可以直接枚举胜场(从最多到0),将分数减去差值,由于每次都少减一个差值,所以对w取模的结果是均匀移动的,所以当取模后的值原来出现过,那么说明必然无解。这样枚举的复杂度就降到O(w)了。

#include <iostream>
using namespace std;

typedef long long ll;

int vis[100005];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	ll n,p,d,w;
	cin >> n >> p >> d >> w;
	ll gap = d - w;
	ll ans1,ans2;
	int flag = 0;
	for (ll i = min(p/d,n); i >= 0; i--)
	{
		ll t = p - i * gap;
		ll z = t % w;
		if( vis[z] )
		{
			flag = 1;
			break;
		}
		if( z == 0 )
		{
			ans1 = i;
			ans2 = (t / w) - i;
			break;
		}
		vis[z] = 1;
	}
	if( flag || ans1 + ans2 > n ) cout << -1 << '\n';
	else cout << ans1 << ' ' << ans2 << ' ' << n - ans1 - ans2 << '\n';
	return 0;
}

发布了103 篇原创文章 · 获赞 6 · 访问量 7019

猜你喜欢

转载自blog.csdn.net/weixin_44316314/article/details/104758260