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; } }
浙公网安备 33010602011771号