视频刷题笔记 二分法

upper_bound以及lower_bound详解

在这里插入图片描述

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
struct p{
	double a1;
	int a2;
}num[1000];
bool cmp(p u,p v){
	if(u.a1==v.a1)
	  return u.a2>v.a2;//若折扣率相同,取折扣金额大的 
	else
	  return u.a1<v.a1;//要是不同则折扣率从小到大排序,折扣率越小,付的钱越少 
}
int main(){
	int N,T,i;
	while(cin>>N>>T){
	for(i=0;i<N;i++){
		cin>>num[i].a1>>num[i].a2;	
	}
	sort(num,num+N,cmp);
	double ans=0.0;//ans表示最后要支付的金钱 
	for(i=0;i<N;i++){
		int k;
		k=min(T,num[i].a2);//k从总钱数和每人折扣上限中取最小值,这步为了防止最后个人的折扣金额大于总消费 
		ans+=double(k*num[i].a1);//把个人需要支付的钱加进去 
		T-=k;//看看其余的钱
		if(T<0)
		  break;//如果结算完毕了,就跳出		 
	}//for
	if(T>0)//要是所有的人优惠都用完了,超过折扣金额的按原价付
	ans+=(double)T; 
	 printf("%.2lf\n",ans);  
	}	
	return 0;
}

在这里插入图片描述

#include<iostream>
#include<cmath>
#include<cstdio>
#include<string>
using namespace std;
int main()
{int w[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
 char check[]={'1','0','x','9','8','7','6','5','4','3','2'};
 string id;
 cin>>id;
 if(id.size()!=18)
  cout<<"输入错误"<<endl;
  int num=0;
 for(int i=0;i<17;i++){
 	num+=(id[i]-'0')*w[i];
 }
 int x=num%11;
 int y=check[x]-'0';
 if(y==id[17]-'0')
 cout<<id<<" 正确"<<endl;
 else{
 	for(int i=0;i<16;i++)
 	cout<<id[i]; 
 	cout<<check[x]<<endl;	
 }
  	
  return 0; 
} 

在这里插入图片描述

#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
using namespace std;
int a[100010];
int main(){
	int n;
	cout<<"请输入样例的个数"<<endl;
	cin>>n;//n代表数字串的个数 
    while(n--){ 
		int x,y;//查找数的范围,p1 p2代表位置 
		int len;
		cout<<"输入数字长度"<<endl;
		cin>>len;
		cout<<"输入数字"<<endl;
		for(int i=0;i<len;i++)
		 cin>>a[i];//得到数字 
		 sort(a,a+len);
		 	cout<<"输入要对数字操作的次数"<<endl;
		int q;
		cin>>q;//对每个数字串的询问次数 
		while(q--){
		cout<<"输入操作区间"<<endl;
			cin>>x>>y;
	      int p1=(int)(lower_bound(a,a+len,x)-a); 
	      int p2=(int)(upper_bound(a,a+len,y)-a); 
	     cout<<p2-p1<<endl; 
		} 
		 
	}
	
	return 0;
}

在这里插入图片描述

#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
using namespace std;
#define maxnum2 100010 
int a[maxnum2],b[maxnum2],c[maxnum2],d[maxnum2],ab[maxnum2],cd[maxnum2];
int main(){
   int n;//n代表行数 
   int num=0;
   while(cin>>n){
   	for(int i=0;i<n;i++)
   	cin>>a[i]>>b[i]>>c[i]>>d[i];
   	//每两列有t*t次比较 
   	for(int i=0;i<n;i++){
   	 for(int j=0;j<n;j++){
   	 	ab[num]=-(a[i]+b[j]);
   	 	cd[num]=c[i]+d[j];
   	 	num++;
   	 }
   	}//先分别把两行进行暴力加法,最后对这两行进行筛选
	  sort(cd,cd+num);
	  int count=0;
	  int p1,p2;//代表位置,好计算数值相等的个数
	  for(int i=0;i<num;i++){
	  	p1=(int)(lower_bound(cd,cd+num,ab[i])-cd);
	  	p2=(int)(upper_bound(cd,cd+num,ab[i])-cd);
	  	count+=(p2-p1);
	  } 
	  cout<<count<<endl;
	    
   }	
	return 0;
}
发布了48 篇原创文章 · 获赞 0 · 访问量 1014

猜你喜欢

转载自blog.csdn.net/weixin_45191675/article/details/105201200