悬关,求助省选D1T1
  • 板块学术版
  • 楼主水星湖psgqwq
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/3 00:41
  • 上次更新2024/3/3 09:12:42
查看原帖
悬关,求助省选D1T1
974277
水星湖psgqwq楼主2024/3/3 00:41

样例一能过,剩下两个样例部分输出与答案相差一小点,或者有解输出的无解

#include <bits/stdc++.h>
#define int long long
using namespace std;
int ans, n, k, x, y, s[100005], t[100005];
int a1;
void case1(int i)
{
    int a = 0;
    if(s[n] + t[n] - n * k > 0)
    {
        a = (i * k + x + y - t[i] - s[i]) / (s[n] + t[n] - n * k);
        if(a > 0) a = 0;
    }
    if(s[n] + t[n] - n * k < 0)
    {
        a = ceil(1.0 * (i * k + x + y - t[i] - s[i]) / (s[n] + t[n] - n * k));
        // a1 = (i * k + x + y - t[i] - s[i] + s[n] + t[n] - n * k - 1) / (s[n] + t[n] - n * k);
        // if(a != a1) cout << a<<" "<<a1 << endl;
    }
    // cout << "1 "<< a << " " << i << endl;
    if(a >= 0 && a * s[n] + s[i] - x >= 0 && a * t[n] + t[i] - y >= 0 && a * s[n] + s[i] - x + a * t[n] + t[i] - y <= a * n * k + i * k)
        ans = min(ans,a * n + i);
}
void case2(int i)
{
    int a = 0;
    if(s[n] - t[n] - n * k > 0)
    {
        a = (i * k + x - y + t[i] - s[i]) / (s[n] - t[n] - n * k);
        if(a > 0) a = 0;
    }
    if(s[n] - t[n] - n * k < 0)
    {
        a = ceil(1.0 * (i * k + x - y + t[i] - s[i]) / (s[n] - t[n] - n * k));
        // a1 = (i * k + x - y + t[i] - s[i] + s[n] - t[n] - n * k - 1) / (s[n] - t[n] - n * k);
        // if(a != a1) cout << a<<" "<<a1 << endl;
    }
    // cout << "2 "<< a << " " << i << endl;
    if(a >= 0 && a * s[n] + s[i] - x >= 0 && a * t[n] + t[i] - y <= 0 && a * s[n] + s[i] - x - a * t[n] - t[i] + y <= a * n * k + i * k)
        ans = min(ans,a * n + i);
}
void case3(int i)
{
    int a = 0;
    if(t[n] - s[n] - n * k > 0)
    {
        a = (i * k - x - y + t[i] + s[i]) / (t[n] - s[n] - n * k);
        if(a > 0) a = 0;
    }
    if(t[n] - s[n] - n * k < 0)
    {
        a = ceil(1.0 * (i * k - x - y + t[i] + s[i]) / (t[n] - s[n] - n * k));
        // a1 = (i * k - x - y + t[i] + s[i] + t[n] - s[n] - n * k - 1) / (t[n] - s[n] - n * k);
        // if(a != a1) cout << a<<" "<<a1 << endl;
    }
    // cout << "3 "<< a << " " << i << endl;
    if(a >= 0 && a * s[n] + s[i] - x <= 0 && a * t[n] + t[i] - y <= 0 && x + y - s[i] - t[i] - a * s[n] - a * t[n] <= a * n * k + i * k)
        ans = min(ans,a * n + i);
}
void case4(int i)
{
    int a = 0;
    if(t[n] - s[n] - n * k > 0)
    {
        a = (i * k - x + y - t[i] + s[i]) / (t[n] - s[n] - n * k);
        if(a > 0) a = 0;
    }
    if(t[n] - s[n] - n * k < 0)
    {
        a = ceil(1.0 * (i * k - x + y - t[i] + s[i]) / (t[n] - s[n] - n * k));
        // a1 = (i * k - x + y - t[i] + s[i] + t[n] - s[n] - n * k - 1) / (t[n] - s[n] - n * k);
        // if(a != a1) cout << a << " " << a1 << endl;
    }
    // cout << "4 "<< a << " " << i << endl;
    if(a >= 0 && a * s[n] + s[i] - x <= 0 && a * t[n] + t[i] - y >= 0 && x - s[i] - a * s[n] + a * t[n] + t[i] - y <= a * n * k + i * k)
        ans = min(ans,a * n + i);
}
void solve()
{
    
    scanf("%lld%lld%lld%lld",&n,&k,&x,&y);
    
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld",&s[i],&t[i]);
        s[i] += s[i-1];
        t[i] += t[i-1];
    }
    if(x == 0 && y == 0)
    {
        cout << 0 << endl;
        return;
    }
    ans = 9e18;

    for(int i=1;i<=n;i++)
    {
        case1(i);
        case2(i);
        case3(i);
        case4(i);
    }
    if(ans == 9e18)ans = -1;
    printf("%lld\n", ans);
}
signed main()
{
    int t;cin>>t;
    while(t--)solve();
    return 0;
}
2024/3/3 00:41
加载中...