欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

xzj 猜数字&二分

时间:2024-05-11 15:09 作者:admin 点击:
#include iostream #include cstdlib #include ctime using namespace std; int main() { srand(time(0));//seed rand 随机种子 //couttime(0);//1970年1月1日0时0分0秒到运行程序时经过的秒数 int x=rand()%100+1;//随机数字范围与

#include <iostream>

#include <cstdlib>

#include <ctime>

using namespace std;

int main() {

   srand(time(0));//seed rand 随机种子

   //cout<<time(0);//1970年1月1日0时0分0秒到运行程序时经过的秒数

   int x=rand()%100+1;//随机数字范围与电脑本身有关,最小0~2^15,最大0~2^31

   int c=0;

   int l=1,r=100;

   cout<<"本次猜数字:"<<x<<endl;

   while(l<r){

       int mid=(l+r)/2;

       cout<<"当前数据在:"<<l<<"~"<<r<<",猜测值为:"<<mid<<endl;

       c++;

       if(mid==x) break;

       else if(mid>x) r=mid-1;

       else l=mid+1;

   }

   cout<<"猜了"<<c<<"次";

   return 0;

}


输入n,输入n个正整数,输入m,查询在这n个正整数中是否存在m

存在输出1,不存在输出0

int n,m,num[10000];

cin>>n;

for(int i=1;i<=n;i++){

   cin>>num[i];

}

cin>>m;

int ans=0;

for(int i=1;i<=n;i++){

   if(num[i]==m){

       ans=1;

       break;

   }

}

cout<<ans<<endl;


输入n,输入n个正整数,输入t组数据,每组一个m,查询在这n个正整数中是否存在m

存在输出1,不存在输出0,换行输出t组答案

二分法使用时,答案数据必须是有序的

int n,m,t,num[10000];

cin>>n;

for(int i=1;i<=n;i++){

   cin>>num[i];

}

sort(num+1,num+n+1);//二分法的必须步骤,一定是有序的

cin>>t;

while(t--){

   cin>>m;

   int ans=0;

   int l=1,r=n;//二分法找两端

   while(l<r){ //在有数据的范围内

       int mid=(l+r)/2;

       //根据条件缩小范围

       if(num[mid]==m){

           ans=1;

           break;

       }

       else if(num[mid]>m) r=mid-1;

       else l=mid+1;

   }

   cout<<ans<<endl;

}

输入n,输入n个正整数,输入一个m,查询在这n个正整数中是否存在m

存在输出下标,不存在输出-1


int n,m,t;

struct Num{

   int xb;

   int a;    

}num[10000];

bool cmp(Num a,Num b){

   return a.a<b.a;

}

cin>>n;

for(int i=1;i<=n;i++){

   cin>>num[i].a;

   num[i].xb=i;

}

sort(num+1,num+n+1,cmp);//二分法的必须步骤,一定是有序的

cin>>m;

int ans=-1;

int l=1,r=n;//二分法找两端

while(l<r){ //在有数据的范围内

   int mid=(l+r)/2;

   //根据条件缩小范围

   if(num[mid].a==m){

       ans=num[mid].xb;

       break;

   }

   else if(num[mid]>m) r=mid-1;

   else l=mid+1;

}

cout<<ans<<endl;


输入n,输入n个数字,输入m

输出距离m最近的比m小的那个数字[比m小的最大的数]

如果没有输出-1

输入

5

2 35 7 68 51

40

输出

35

int n,m,num[10000];

cin>>n;

for(int i=0;i<n;i++){

   cin>>num[i];

}

sort(num,num+n);

cin>>m;

int l=0,r=n-1;

while(l<r){

   //int mid=(l+r)/2;//num[2]成立 num[3]不成立 避免死循环

   int mid=(l+r+1)/2;

   if(num[mid]<m){

       l=mid;

   }

   else{

       r=mid-1;

   }

}

if(num[l]==m) cout<<-1;

else cout<<num[l];

分治算法:二分查找->二分答案->快速排序(递归)

作业:1240必做,1247选做

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%