contest start

题目:

https://codeforces.com/contest/1539/my

有 n 个人参加某个比赛,他们开始每隔 x 分钟参加一次。这意味着第一个参与者在时间 0 开始,第二个参与者在时间 x 开始,第三个参与者在时间 2⋅x 开始,依此类推。

每个参与者的比赛持续时间为 t 分钟,因此第一个参与者在时间 t 完成比赛,第二个 - 在时间 t+x,依此类推。当参与者完成比赛时,他们的不满意等于开始比赛(或现在开始比赛)但尚未完成比赛的参与者数量。

确定所有参与者的不满总和。

输入
第一行包含一个整数 k (1≤k≤1000)——测试用例的数量。

接下来的 k 行中的每一行都包含三个整数 n, x, t (1≤n,x,t≤2⋅109)——参与者人数、开始间隔和比赛持续时间。

输出
打印k行,在第i行打印第i个测试用例中参与者的总不满。
在第一个例子中,第一个参与者从 0 开始,在时间 5 结束。到那时第二个和第三个参与者开始,所以第一个参与者的不满为 2。

第二个参与者在时间 2 开始并在时间 7 结束。到那个时候第三个第四个参与者开始,所以第二个参与者的不满为 2。

第三个参与者从4点开始,到9点结束。到时候第四个参与者开始,所以第三个参与者的不满为1。

第四位参赛者6点开始,11点结束。到11点大家都完成了比赛,所以第四位参赛者的不满为0。

在第二个例子中,第一个参与者从 0 开始,在时间 2 结束。到那个时候,第二个参与者开始,第三个参与者正好在时间 2 开始。所以第一个参与者的不满是 2。

第二个参与者在时间 1 开始并在时间 3 结束。此时第三个参与者正在解决比赛。

 

 

第一种情况:

当t/x>n时

意味着第一个结束时后面的都开始了,所以整个数列为n-1,n-2直到0

所以ans=(n-1)*n/2;

第二种情况:
1.当i+t/x<=n时

每次都是增加t/x个

ans+=t/x*(n-t/x)

2.当i=n-t/x+1~n时

是递减数列求和

ans+=(0+t/x-1)*t/x/2;

#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
int k;
cin>>k;
ll n,x,t;
while(k--)
{
    cin>>n>>x>>t;
    long long ans=0;
    if(t/x>n)
    {
    ans=(n-1)*n/2;
    }
    else
    {
        ans=t/x*(n-t/x);
        ans+=t/x*(t/x-1)/2;
    }
    cout<<ans<<endl;
}
}

 

posted @ 2021-07-14 10:40  废柴废柴少女  阅读(62)  评论(0)    收藏  举报