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