第一次双周赛

本文介绍了如何用高精度算法实现十六进制数的乘法,通过实例展示了7-2a*7-2b的解决方案。此外,还讲解了7-3山头狙击战中二分答案策略,通过二分查找优化装子弹时间。最后,探讨了一元三次方程的二分大法解法。
摘要由CSDN通过智能技术生成

第一次双周赛

7-2 a*b

  • 知识点:十六进制数的高精度乘法

  • 核心代码:用两个for循环处理

    for(int i=0;i<len1;i++)
    	{
    		len3=i;
    		for(int j=0;j<len2;j++)
    		{
    			z[len3]+=x[i]*y[j];
    			if(z[len3]>=16)
    			{
    				z[len3+1]+=z[len3]/16;
    				z[len3]%=16;
    			}
    			len3++;
    		}
    	}
    
  • 注意:要记得去掉先导0!!

    int index=len1+len2;
    	while(index>0&&z[index]==0)
    	index--;
    	for(int i=index;i>=0;i--)
    	{
    		if(z[i]>=0&&z[i]<=9)
    		cout<<z[i];
    		else 
    		cout<<q[z[i]-10];
    	}
    

7-3 山头狙击战

  • 知识点:二分答案(装子弹时间:最大的最小

  • 主要思路:mi[]数组记录敌人一开始的位置,sort排序,从离小明最近的敌人开始考虑

    ​ 用s记录下一个敌人往前走了多少

    ​ mi[i]-s表示敌人距离小明的相对位置

    ​ 二分法检查当前答案是否能让能击倒敌人数大于实际敌人数

    #include<bits/stdc++.h>
    using namespace std;
    int m,n,mi[10000005],ans=-1,sum=0,s=0;
    bool check(int k)
    {
    	if(mi[0]>m)
    	s=mi[0]-m; //s表示下一个敌人往前走了多少 
    	sum++;
    	for(int i=1;i<n;i++)
    	{
    		s+=k;
    		if(mi[i]<s) break; //敌人已经到小明处
    		else if(mi[i]-s>m) //敌人在小明射程以外
    		{
    			s+=mi[i]-s-m;
    			sum++; 
    		 } 
    		 else
    		 sum++;
    	}
    	
    	if(sum>=n) return true;
    	return false;
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=0;i<n;i++)
    	cin>>mi[i];
    	sort(mi,mi+n);
    	
    	int l=1,r=mi[n-1];
    	while(l<=r)
    	{
    		int mid=l+(r-l)/2;
    		if(check(mid))
    		{
    			ans=mid;
    			l=mid+1;
    		}
    		else
    		{
    			r=mid-1;
    		}
    		sum=0;
    		s=0;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

7-5 一元三次方程

  • 二分大法好QWQ
#include <bits/stdc++.h>
using namespace std;
double a,b,c,d,n,p,q;
double f(double x){
    return (a*x*x*x+b*x*x+c*x+d);
}
void js(){
    for(double i=p;i<q;i++){
        double l=i,r=i+1,mid;
        if(f(l)==0) printf("%.6lf ",l);
        else if(f(l)*f(r)<0){
            while((r-l)>1e-7){
                mid=(l+r)/2;
                if(f(mid)*f(r)<=0) l=mid;
                else r=mid;
            }
            printf("%.6lf ",l);
        }
    }
}
int main(){
	int t;
	cin>>t;
	while(t--)
	{
		cin>>a>>b>>c>>d>>p>>q;
		js();
		cout<<endl;
	}
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值