洛谷P8682 [蓝桥杯 2019 省 B] 等差数列
思路:
因为需要求这几个数的最短等差数列,那么可以将这几个数排列,然后找到相邻两个数的最大公因数,而这个最大公因数就是等差数列的最大公差。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+10;
int a[N];
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int d=0;
for(int i=1;i<n;i++)
d=gcd(d,a[i]-a[i-1]);
if(d)cout<<(a[n-1]-a[0])/d+1;
else cout<<n;
return 0;
}
洛谷P1226 【模板】快速幂
思路:
这题的话觉得没什么可说的,可以说是模板题,写个模板即可
代码:
#include <iostream>
using namespace std;
typedef long long LL;
int a,b,p;
void qmi(int a,int b,int p)
{
int x=a,y=b;
LL res=1;
while(b)
{
if(b%2)res=(LL)res*a%p;
a=(LL)a*a%p;
b/=2;
}
printf("%d^%d mod %d=%d",x,y,p,res);
}
int main()
{
cin>>a>>b>>p;
qmi(a,b,p);
return 0;
}
洛谷P2249 【深基13.例1】查找
思路:
二分查找,基本也是模板题,一开始查找里面的if
里面的条件写反了,查了一会😭
代码:
#include <iostream>
using namespace std;
const int N=1e6+10;
int a[N];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
while(m--)
{
int x;
cin>>x;
int l=1,r=n;
while(l<r)
{
int mid=l+r>>1;
if(a[mid]>=x)r=mid;
else l=mid+1;
}
if(a[l]==x)cout<<l<<' ';
else cout<<"-1 ";
}
return 0;
}
洛谷P1824 进击的奶牛
思路:
大概在半年前写过,但是时间太长也差不多忘了,再写还是没写出来,没想到用二分答案做。
题目中有个需要注意的地方,比如位置1
和位置4
的距离是3,我一直以为是看两个位置之间的距离,所以debug
了很久😭😭😭
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e5+10;
int a[N];
int n,c;
bool check(int x)
{
int num=1,place=0;
for(int i=0;i<n;i++)
{
if(a[i]-a[place]>=x)
{
num++;
place=i;
}
}
if(num>=c)return true;
else return false;
}
int main()
{
cin>>n>>c;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int l=a[0],r=a[n-1],ans=0;
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid))
{
l=mid;
ans=mid;
}
else r=mid-1;
}
cout<<ans;
return 0;
}