开启快乐的二(玄)分(学)之旅~
只放我会的题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;
}
得。自闭。