首页 > 其他分享 >codeforces round 971(div4)E(二分答案,禁用数学方法)

codeforces round 971(div4)E(二分答案,禁用数学方法)

时间:2024-09-26 19:44:46浏览次数:6  
标签:二分 zong 971 ll codeforces cin 答案 test div4

解题历程:

开始想的是用数学公式的方法,利用公式推出二次函数,再求出根,再用根求出答案,检查了一个小时,结果怎么改都有细微的偏差,最后发现答案先单调递减在单调递增,那么可以用二分答案的方法查找最小的答案,二分对细节的处理要求比较高,于是在二分中加入了一个限制,当二分的区间小于5时,就直接遍历五个答案判断

代码:

#include<bits/stdc++.h>

#define ll long long
#define endl "\n"
using namespace std;


ll zong(ll s,ll k,ll n)
{
	return abs((k+k+s-1)*s-(k+s+k+n-1)*(n-s))/2;
}

int main(void )
{   
	//ios::sync_with_stdio(0);
	//cin.tie(0),cout.tie(0);
    int test=1;
    cin>>test;
	//string str="narek";
    while(test--)
    {
    	ll n,k;
    	cin>>n>>k;
    	ll l=0,r=n;
    	ll t=(l+r)/2;
    	while(1)
    	{
    		if(zong(t,k,n)<=zong(t+1,k,n)&&zong(t,k,n)<=zong(t-1,k,n))break;
    		if(r-l<100)
    		{
    			for(int i=l;i<=r;i++)
    			{
    				if(zong(i,k,n)<=zong(i+1,k,n)&&zong(i,k,n)<=zong(i-1,k,n))break;
				}
			}
    		if(zong(t,k,n)<zong(t+1,k,n)&&zong(t,k,n)>zong(t-1,k,n))
    		{
    			r=t;
    			t=(t+l)/2;
			}
			if(zong(t,k,n)>zong(t+1,k,n)&&zong(t,k,n)<zong(t-1,k,n))
    		{
    			l=t;
    			t=(t+r)/2;
			}
		}
		cout<<zong(t,k,n)<<endl;
	}
        
    return 0;
}

反思:

以后要是推出的公式非常复杂,那么就不能用数学的方法进行求解,因为在计算的过程中会有精度丢失,最后输出会和答案发生细微的偏差

标签:二分,zong,971,ll,codeforces,cin,答案,test,div4
From: https://www.cnblogs.com/cavendishboys/p/18434177

相关文章

  • Codeforces Round 971 (Div. 4)题解记录(G3待补)
    A.Minimize!暴力模拟一遍即可#include<iostream>#include<queue>#include<deque>#include<map>#include<set>#include<stack>#include<vector>#include<bitset>#include<math.h>#include<random>#include&l......
  • Codeforces Round 970 (Div. 3)A~F
    CodeforcesRound970(Div.3)A~FA.Sakurako'sExam把1的个数和2的个数按奇偶分类讨论即可。//AConemoretimes//nndbk#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintmod=1e9+7;constintN=2e5+10;intmain(){ios......
  • Codeforces Round 964 (Div. 4)A~G1
    CodeforcesRound964(Div.4)A~G1A.A+BAgain?签到//AConemoretimes//nndbk#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintmod=1e9+7;constintN=2e5+10;intmain(){ios::sync_with_stdio(false);ci......
  • Codeforces Round 973 (Div. 2)
    C.PasswordCracking(C)若字符串只向一个方向延伸,则一定能通过\(2n\)次询问获得结果;可以先向后猜测,当该侧继续添加字符1与0都不符合要求时、说明已经到达字符串末端,继续询问前缀即可。voidsolve(){intn;cin>>n;strings="";boolflag=0;w......
  • Codeforces Round 971 (Div. 4)A~G1
    CodeforcesRound971(Div.4)A~G1A.Minimize!签到不多说。//AConemoretimes//nndbk#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintmod=1e9+7;constintN=2e5+10;intmain(){ ios::sync_with_stdio(false......
  • Codeforces Round 974 (Div. 3)题解记录
    A.RobinHelps签到模拟,遍历一遍即可,注意没钱时不给钱。\(O(n)\)#include<iostream>#include<set>#include<map>#include<vector>#include<algorithm>#include<bitset>#include<math.h>#include<string>#include<string.h>#......
  • Codeforces Round 959 (Div. 1 + Div. 2) C. Hungry Games题解
    CodeforcesRound959(Div.1+Div.2)C.HungryGames题解题目链接大致题意:给定一个长度为n的数组,并且给出一对l,r表示一个区间,如果∑i......
  • Codeforces Round 974 (Div.3) 题解
    CodeforcesRound974(Div.3)题解A.RobinHelps模拟按照题意模拟即可。voidShowball(){intn,k;cin>>n>>k;intcur=0,ans=0;for(inti=0;i<n;i++){intx;cin>>x;if(x>=k)cur+=x;elseif(!x){if(cur>=1)cu......
  • codeforces round 974(div.3) D(学会灵活拆分数据)
    解题历程:首先想到的是用数组记录,遍历每一个任务的区间,对区间内的数值加1,比如对于发生在4和8天之内的任务,a[4]++,a[5]++……a[8]++。然后用双指针,记录持续天数的开始下标和结束下标,以l和l+d为边界的窗口遍历每一天,若是最高位寻找任务最多的一天,和区间最大值最小的一天。后来发现......
  • Codeforces Round 973 (Div. 2)
    A.Zhan'sBlender有\(n\)个水果,每秒可以消耗\(\min\{x,y\}\)个,问需要多少时间。整数除法的上取整操作即可。点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsignedlonglongintread(){intx=0;boolf=......