2020.1.5 大一寒假训练六(二分查找)

开启快乐的二(玄)分(学)之旅~
只放我会的题23333

Problem A:NEFU956 二分查找

手搓一个二分:

#include<bits/stdc++.h>
using namespace std;
int a[1000020];
int main()
{
	int n, x;
	while(scanf("%d%d", &n, &x) != EOF)
	{
		for(int i=1; i<=n; i++)
			scanf("%d", &a[i]);
		int L=1, R=n, mid;
		while(L<R)
		{
			mid=(L+R)/2;
			if(a[mid] < x) L = mid+1;
			else R = mid;
			
		}
		printf("%d\n", mid);
	}
	return 0;
}

使用STL:

#include<bits/stdc++.h>
using namespace std;
int a[1000020];
int main()
{
	int n, x;
	while(scanf("%d%d", &n, &x) != EOF)
	{
		for(int i=1; i<=n; i++)
			scanf("%d", &a[i]);
		int tmp = upper_bound(a+1, a+n+1, x) - a - 1;
		printf("%d\n", tmp);
	}
	return 0;
}

Problem B:NEFU1646 小清新的二分查找之旅

#include<bits/stdc++.h>
using namespace std;
int n, q, k, a[1000010];
int main()
{
	while(scanf("%d%d", &n, &q) != EOF)
	{
		for(int i=1; i<=n; i++)
			scanf("%d", &a[i]);
		for(int i=1; i<=q; i++)
		{
			scanf("%d", &k);
			int l=1, r=n, mid;
			bool flag=false;
			while(l<r)
			{
				mid = (l+r)/2;
				if(a[mid] < k) l = mid+1;
				else r = mid;
				if(a[mid]==k) flag = true;
			}
			if(flag) printf("no\n");
			else printf("YES\n");
		}
	}
	return 0;
}

Problem C:NEFU1645 小清新的函数坐标-二分

//单增  
#include<bits/stdc++.h>
using namespace std;
double y, x;
double F(double t)
{
	return 0.0001*pow(t, 5)+0.003*pow(t, 3)+0.5*t-3;
}
int main()
{
	while(scanf("%lf", &y) != EOF)
	{
		double l=-20, r=20, mid;
		while(F(r)-F(l) >= 1e-5)
		{
			mid = (l+r)/2;
			if(F(mid) > y) r=mid;
			else l=mid;
		}
		printf("%.4lf\n", mid);
	}
	return 0;
}

Problem D:NEFU1647 小清新的二倍问题加强版-二分-桶排

二分做法

#include<bits/stdc++.h>
using namespace std;
int n, m, a[10010];
int main()
{
	scanf("%d", &n);
	while(n--)
	{
		int k, cnt=0;
		for(int i=1; ; i++)
		{
			//cin>>a[i];
			scanf("%d", &a[i]);
			if(a[i]==0)
			{
				k = i-1;
				break;
			}
		}
		sort(a+1, a+1+k);
		//cout<<k<<endl;
		for(int i=1; i<=k; i++)
		{
			int L=i, R=k, mid;
			bool flag=0;
			while(L<=R)
			{
				mid = (L+R)/2;
				if(a[mid]>2*a[i]) R = mid-1;
				if(a[mid]<2*a[i]) L = mid+1;
				if(a[mid]==2*a[i])
				{
					flag = 1;
					break;
				}
				//cout<<a[mid]<<" "<<a[i]<<endl;
				//cout<<mid<<" "<<L<<" "<<R<<endl;
			}
			if(flag) cnt++;
		}
		printf("%d\n", cnt);
	}
	return 0;
}

桶排做法

#include<bits/stdc++.h>
using namespace std;
int n, m, a[100010];
bool flag[200010];
int main()
{
	scanf("%d", &n);
	while(n--)
	{
		memset(flag, 0, sizeof(flag));
		int k, tot=0, cnt=0;
		for(int i=1; ; i++)
		{
			//cin>>a[i];
			scanf("%d", &a[i]);
			flag[a[i]*2] = 1;
			if(a[i]==0) 
			{
				k = i-1;
				break;
			}
		}
		for(int i=1; i<=k; i++)
        {
            if(flag[a[i]])
                cnt++;
        }
        printf("%d\n", cnt);
	}
	return 0;
}

Problem E:NEFU1303 简单几何-二分

#include<bits/stdc++.h>
using namespace std;
int t, h;
const double pi = acos(-1.0);
bool check(double r)
{
    if(h*(pi*r*r-r) <= pow(r, pi)) return true;
    else return false;
}
int main()
{
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &h);
        double L=0.0, R=100000.0, mid;
        while(L < R)
        {
            mid = (L+R)/2;
            if(R-L<=1e-8) break;
            if(check(mid)) R = mid;
            else L = mid;
        }
        printf("%.4lf\n", mid);
    }
    return 0;
}

Problem J:NEFU1245 二分查找加强版

#include<bits/stdc++.h>
using namespace std;
int a[2000020];
int main()
{
	int n, x;
	while(scanf("%d%d", &n, &x) != EOF)
	{
		for(int i=1; i<=n; i++)
			scanf("%d", &a[i]);
		sort(a+1, a+n+1);
		int L=1, R=n, mid;
		while(L<R)
		{
			mid=(L+R)/2;
			if(a[mid] < x) L = mid+1;
			else R = mid;
			
		}
		printf("%d\n", mid);
	}
	return 0;
}

得。自闭。

发布了58 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/baidu_41248654/article/details/103845456