二分A1085 A1010 A1044 A1048二分解法

A1085
用到了upper_bound函数,以及在pat当中运行错误时,要看一下数据类型是不是应该大一点

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100001;
int n,p,a[maxn];// 

int main()
{
	scanf("%d %d",&n,&p);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		}	
	sort(a,a+n);
	int ans=1;//表示长度至少为1 
	for(int i=0;i<n;i++)
	{
		int j=upper_bound(a+i+1,a+n,(long long)a[i]*p)-a;//返回第一个大于a[i]*p的元素的下标 
		ans=max(ans,j-i);//这样的话位置用j-i就可以,否则的话要用j-i+1 
	} 
	printf("%d\n",ans);
	return 0;
 } 

A1010
cmath头文件包括sin cos exp log pow sqrt fabs ceil floor形参为double类型,返回值也为double类型
float pow(float x,float y),求x的y次幂

#include头文件函数:
isalnum:判断字符变量c是否为字母或数字,若是则返回非零,否则返回零。
isalpha():判断字符ch是否为英文字母,若为英文字母,返回非0(小写字母为2,大写字母为1)。若不是字母,返回0。
isdigit() :isdigit是计算机C(C++)语言中的一个函数,主要用于检查其参数是否为十进制数字字符。
islower() : 如果参数是小写字母,函数返回true
isupper() :如果参数是大写字母,函数返回true
tolower() :如果参数是大写字符,返回其小写,否则返回该参数
toupper() :如果参数是小写字符,返回其大写,否则返回该参数

min_element 和 max_element:头文件:#include
作用:返回容器中最小值和最大值的指针。max_element(first,end,cmp);其中cmp为可选择参数!

这题真坑

#include<iostream>
#include<cmath>
//cmath头文件包括sin cos exp log pow sqrt fabs ceil floor形参为double类型,返回值也为double类型
//float pow(float x,float y),求x的y次幂 
#include<cctype>//
#include<algorithm> 
using namespace std;

long long convert(string n,long long radix)
{
	//给一个数值和一个进制,将数变为10进制
	long long sum=0;
	int temp=0,index=0;
	for(auto it=n.rbegin();it!=n.rend();it++)//反向迭代器,从倒数第一个数开始 
	{
		temp=isdigit(*it)?*it-'0':*it-'a'+10;//判断字符是否为数字,如果为的话,输出数字,不为的话,转换为数字 
		sum+=temp*pow(radix,index++);//index++先是index=0,然后index++ 
	}
	return sum; 
 } 
long long find_radix(string n,long long num)
{
	//找到n是几进制的,找不到的话就输出别的
	char it=*max_element(n.begin(),n.end());
	long long low=(isdigit(it)?it-'0':it-'a'+10)+1;
	long long high=max(num,low);
	while(low<=high){
		long long mid=(low+high)/2;
		long long t=convert(n,mid);
		if(t<0||t>num)  high=mid-1;
		else if(t==num) return mid;
		else low=mid+1;
	}
	return -1;
}
int main()
{
	string n1,n2;//n1和n2有可能是字母 
	int tag;
	long long radix,result_radix;
	cin>>n1>>n2>>tag>>radix;	
	result_radix=tag==1?find_radix(n2,convert(n1,radix)):find_radix(n1,convert(n2,radix));
	if(result_radix!=-1){
		printf("%lld",result_radix);
	} else{
		printf("Impossible");
	}
	return 0;
}

A1044

#include<iostream>
using namespace std;

const int maxn=100001;
int sum[maxn];
int nearm=100000001;
//返回在区间(l,r)内第一个大于x的位置 
int upper_bound(int l,int r,int x)
{
	int left=l,right=r,mid;
	while(left<right){
		mid=(left+right)/2;
		if(sum[mid]>x){
			right=mid;
		}else{
			left=mid+1;
		}
	}
	return left;
}


int main()
{
	int n,m;
	scanf("%d %d",&n,&m);//n是链上的钻石数量,m是客户需要花费的钱数
	sum[0]=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&sum[i]);
		sum[i]+=sum[i-1];
	 } 
	for(int i=1;i<=n;i++)//枚举左端点 
	{
		int j=upper_bound(i,n+1,sum[i-1]+m);//找到右端点 
		if(sum[j-1]-sum[i-1]==m){//查找成功 
			nearm=m;//最近的m就是m 
			break; 
		}else if(j<=n&&sum[j]-sum[i-1]<nearm)
		{
			nearm=sum[j]-sum[i-1];
		}
	}
	for(int i=1;i<=n;i++){
		int j=upper_bound(i,n+1,sum[i-1]+nearm);
		if(sum[j-1]-sum[i-1]==nearm)
		{
			printf("%d-%d\n",i,j-1);
		}
	}
	return 0;
}

A1048
二分解法1

#include<iostream>
#include<algorithm>
using namespace std;

int a[100001];
int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	sort(a,a+n);
	int flag=0;
	for(int i=0;i<n;i++)
	{
		int j=upper_bound(a+i+1,a+n,m-a[i])-a;
		if(a[i]+a[j-1]==m&&i!=(j-1))
		{
			flag=1;
			printf("%d %d",a[i],a[j-1]);
			break;
		}
	}
	if(flag==0)
	{
		printf("No Solution");
	}
	return 0;
}

二分解法2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值