题目
题意:
有n场比赛,赢了得d分,平局得w分,输了得0分。现在给你一个最后的得分,要求赢了多少场,平了多少场。
分析:
其实我们可以把胜场看成是平局再加上他们之间的差距,那么有解的情况下,就是分数减去差值必须是平局分数的整数倍。
那么我们就可以直接枚举胜场(从最多到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;
}