存一下二分代码

在排序数组中查找元素的第一个和最后一个位置

#include<bits/stdc++.h> 
using namespace std;
const int npr=1E6;
int num[npr];
int target;
// int isblue(int i){
//    if(num[i]<=target){
//       return 0;
//    }
//    return 1;
// }
int n;
   
// void two_fen(int l,int r){
//    while(l!=r){
//       int middle=(l+r)/2;
//       if(isblue(middle)){
//          l=middle;
//       }
//       else{
//          r=middle;
//       }

//    }
//    cout<<l<<" "<<r;
// }
int twoleft() {
    int left=-1,right=n;
    while (left+1 <right) {
        int mid=(left+right)/2;
        if (num[mid] < target) {
            left = mid;
        } else {
            right = mid;
        }
    }
    if(right<n&&num[right]==target){
      return right;
    }
    return -1;
    
}
int twoRight() {
    int left = -1, right = n;
    while (left + 1 < right) {
        int mid = (left + right) / 2;
        if (num[mid] <= target) {
            left = mid;
        } else {
            right = mid;
        }
    }
    if(left >= 0 && num[left] == target){
      return left;
    } 
    return -1;
}
signed main(){
   
   cin>>n;
   for(int i=0;i<n;i++){
      cin>>num[i];
   }
   cin>>target;
   cout<<twoleft()<<" "<<twoRight();
   




   return 0; 
}


循环比赛日程表

#include<bits/stdc++.h>
using namespace std;
const int maxn=1025,maxm=11;
int compt[maxn][maxn];
int m;
int main(){
	scanf("%d",&m);
	int n=1<<m,k=1,half=1;
	compt[0][0]=1;
	while(k<=m)
	{
		for(int i=0;i<half;i++)
			for(int j=0;j<half;j++)
				compt[i][j+half]=compt[i][j]+half;//���Ͻǣ����Ͻ�+2^(n-1)
		for(int i=0;i<half;i++)
			for(int j=0;j<half;j++)
			{
				compt[i+half][j]=compt[i][j+half];//���½ǣ����Ͻ�
				
				compt[i+half][j+half]=compt[i][j];//���½ǣ����Ͻ�
			}
		half*=2;
		k++;
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
			printf("%d ",compt[i][j]);
		putchar('\n');
	}
	return 0;
}

取模运算

#include<bits/stdc++.h> 
using namespace std;
// int modder(int a,int b){
//    int c=a;
//    for(int i=1;i<b;i++){
      
//       a*=c;
//    }
//    return a;

// }
long long c;
long long modder(long long x,long long y){
   
   if(y==0){
      return 1;
   }
   long long isy=modder(x,y/2);
   if(y%2==0){
      return (isy*isy)%c;
   }
   return x*(isy)%c*(isy)%c;

}
signed main(){
   long long a,b;
   cin>>a>>b>>c;
   long long modi=modder(a,b);
   // cout<<modi<<endl;;
   cout<<a<<"^"<<b<<" mod "<<c<<"="<<modi;




   return 0; 
}

2011

#include<bits/stdc++.h> 
using namespace std;
// int modder(int a,int b){
//    int c=a;
//    for(int i=1;i<b;i++){
      
//       a*=c;
//    }
//    return a;

// }
string b;
// long long c;
// long long modder(long long x,long long y){
   
//    if(y==0){
//       return 1;
//    }
//    long long isy=modder(x,y/2);
//    if(y%2==0){
//       return (isy*isy)%1000;
//    }
//    return x*(isy)%1000*(isy)%1000;

// }
signed main(){
   long long a,m=0,s=1;
   cin>>a;
   while(a--){
      cin>>b;
      // printf("%.lld\n",modder(2011,m));
      m=0;
      
      for(int i=1;i<=3;i++){
         if(b.length()>=i)
            m+=(b[b.length()-i]-'0')*pow(10,i-1);

         
      }
      for(int i=0;i<m;i++){
         s=s*2011%10000;
         

         
      }
      cout<<s<<endl;
      s=1;

   }
   // long long modi=modder(a,b);
   // // cout<<modi<<endl;;
   // cout<<a<<"^"<<b<<" mod "<<c<<"="<<modi;
   return 0; 
}

一元三次

#include <bits/stdc++.h>
using namespace std;
double a, b, c, d;
double fx(double x) {
    return a*x*x*x+b*x*x+c*x+d;
}
void finder() {
    double l=-100;double r=100;
    for(double i=-100;i<100;i+=1.0001){
        l=i;
        r=i+1;
        if(fx(l)*fx(r)>0){
			continue;
		}
        while(r-l>1e-6){
          double mid=(l+r)/2;
          if (fx(mid)*fx(r) <= 0) {
             l = mid;
            } 
         else {
               r = mid;
         }
        
        }
        printf("%.2f ",r);
        
    // return l;
    }
    // printf("%.2f ",r);
}
vector<double> roots;
int main() {
   cin>>a>>b>>c>>d;
   finder();
}

特定值

#include<bits/stdc++.h> 
using namespace std;
int a[114514],b[114514];

int main(){
   int n,x;
   cin>>n;
   for(int i=0;i<=n-1;i++){
      cin>>a[i];
      b[i]=i+1;
   }
   cin>>x;
   for(int j=0;j<=n-1;j++){
      if(x==a[j]){
         cout<<b[j];
         break;
      }
   }






















   return 0; 
}

最接近元素

#include<bits/stdc++.h> 
using namespace std;
#define ll long long
const int maxs=1e6+10;
int n;
ll a[maxs],num=0;
ll jiejin(ll b){
   ll l=0,r=n-1;
   if(b<=a[l]){
      return a[l];
   }
   if(b>=a[r]){
      return a[r];
   }
   //ll m=(l+r)/2;//放这里的时候进入循环m不会更新h_h 被卡了好久555
   while(r-l>1){
      // if(b<a[m]){
      //    r=m;

      // }
      ll m=(l+r)/2;
      if(b>=a[m]){
         //r=m;
         l=m;

      }
      else{
         r=m;
      }


   }
   if(abs(a[l]-b)<=abs(a[r]-b)){
      return a[l];

   }
   return a[r];


}
signed main(){
   ll x,s;
   cin>>n;
   for(ll i=0;i<n;i++){
      cin>>a[i];
   }
   cin>>x;;
   for(ll i=0;i<x;i++){
      cin>>s;
      cout<<jiejin(s)<<endl;
      // b[++num]=jiejin(s);

      
   }
   // sort(b,b+num,greater<int>());
   // for(int i=0;i<num;i++){
   //    cout<<b[i]<<endl;
   // }





   return 0; 
}

函数零点

#include<bits/stdc++.h> 
using namespace std;
long double l=1.5,r=2.4,cen=(l+r)/2;
long double x;
long double f=pow(x,5)-15*pow(x,4)+85*pow(x,3)-225*pow(x,2)+274*x-121;
long double fx(){
   while(r-l>=0.00000001){
      cen=(r+l)/2;
      long double mmcen=pow(cen,5)-15*pow(cen,4)+85*pow(cen,3)-225*pow(cen,2)+274*cen-121;
      long double mmr=pow(r,5)-15*pow(r,4)+85*pow(r,3)-225*pow(r,2)+274*r-121;
      long double mml=pow(l,5)-15*pow(l,4)+85*pow(l,3)-225*pow(l,2)+274*l-121;
      if(mmr*mmcen<0){
         l=cen;//如果f(mid)和f(r)的符号相反则说明在[mid,r]区间内存在一个零点
      }
      if(mml*mmcen<0){
         r=cen;//如果f(mid)和f(l)的符号相反则说明在[mid,l]区间内存在一个零点
      }

   }
   return cen;
}
signed main(){
   printf("%.6Lf",fx());




   return 0; 
}

三分

#include<bits/stdc++.h>
using namespace std;
int n;
long double l,r,a[100010];
long double ccccccc(long double x){
	long double cnt=0;
	for(int j=1;j<=n+1;j++){
		cnt=cnt*x+a[j];
	}
	return cnt;
}
int main(){
	cin>>n>>l>>r;
	for(int j=1;j<=n+1;j++){
		cin>>a[j];
	}
	while(r-l>=0.0000000000000001){
		if(ccccccc(l+(r-l)/3.0)<ccccccc(r-(r-l)/3.0)){
			l=l+(r-l)/3;
		}else{
			r=r-(r-l)/3;
		}
	}
	cout<<l;
	
}

数列分段

#include<iostream>
using namespace std;
int n,m;
int a[100000];
int sum=1,cnt;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(cnt+a[i]>m){
			cnt=0;
			sum++;
		}
		cnt+=a[i];
	}
	cout<<sum;
	return 0;
}

木材加工

#include<bits/stdc++.h> 
using namespace std;
#define int long long
int s,n;
int a[9000000];
int l=1,r=1e8;
// void l(int l,int r){
   // while(l<=r){
   //    int mid=(l+r)/2;
   //    int sum=0;
   //    for(int i=0;i<n;i++){
   //       sum+=a[i]/mid;

   //    }
   //    if(sum<s){
   //       l=mid-1;

   //    }
   //    else{
   //       r=mid+1;
   //    }

//    }
//    cout<<l;

// }
signed main(){
   cin>>n>>s;
   for(int i=0;i<n;i++ ){
   		cin>>a[i];
   } 
   // l(ls,rs);
   // cout<<l;
   while(l<=r){
      int mid=(l+r)/2;
      int sum=0;
      for(int i=0;i<n;i++){
         sum+=a[i]/mid;

      }
      if(sum<s){
         r=mid-1;

      }
      else{
         l=mid+1;
      }
      // sum=0;
   }
   cout<<l-1;






   return 0; 
}