P8682 等差数列
1:找最多项,就是找到最小公差 2:每两项的差都是最小公约数的倍数
#include <bits/stdc++.h>
using namespace std;
int main(){
int n=0,d=0,num=0;
cin>>n;
int a[n];
for (int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n); //题目输入不单调,先排个序
d=a[1]-a[0];
for (int j=2;j<n;j++){
d=__gcd(d,a[j]-a[j-1]); //遍历所有项与项间差的最小公约数
}
if (d==0){
cout<<n; //如果结果为零,说明所有项相同
} else{
num=(a[n-1]-a[0])/d+1;
cout<<num;
}
return 0;
}
P1226 快速幂(模板)
1:数学基础(a*b)%p=(a%p*b%p)%p
2:我理解的快速幂是 当指数为偶数时,底数平方,指数折半;当指数为奇数数,由于奇数整除2相当于向下取整,所以先让ans存储少掉的一个底数,再重复平方折半过程;最后当b为1是将先前所有平方值 乘以 过程整除少的值 得到最终结果
#include <stdio.h>
int main(){
long long a,b,ans=1,p,m,n;
scanf("%lld %lld %lld",&a,&b,&p);
m=a;
n=b;
while(b){
if(b%2){
ans=ans*a;
}
a=a*a;
b=b/2;
a=a%p;
ans=ans%p;
}
printf("%lld^%lld mod %lld=%lld",m,n,p,ans%p);
return 0;
}
P2249 【深基13.例1】查找
(鄙人不才,没找到自己写的代码的错误,于是以我自己的理解重新讲解一下别人的代码)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int a[maxn] = {0};
bool cmp(int a, int b){
return a < b;
}
int search(int A[], int left , int right, int x){ //二分查找
int mid;
while(left <right){
mid = (left + right) / 2;
if(A[mid] >= x){ //由于题目要求输出 这个数字在序列中第一次出现的编号
right = mid; //所以将小于等于并入此情况,若相等则继续向左找
}else{
left = mid + 1;
}
}
return left;
}
int main(){
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i++){
cin >> a[i];
}
sort(a, a + n, cmp); //输入为指明单调性,所以排序
int c;
for(int i = 0; i < m; i++){
cin >> c;
if(a[search(a,0, n -1, c)] == c) cout << search(a,0, n -1, c) + 1 << ' '; //判断是否找到
else cout << -1 << ' ';
}
cout << endl;
return 0;
}
P1824 进击的奶牛
(查找讲解发现这是经典的二分答案模板题,鄙人基础弱,自然又是花费九牛二虎之力终于看到了,自己手打了一遍)
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+20;
int a[N];
int n,c;
int cnt(int d){ //cnt函数用贪心算法判断此时的d,能否满足塞入C头牛
int num=1,last=1; //初始化第一头牛为起点
for(int i=2;i<=n;i++){
if(a[i]-a[last]>=d){ //若下一头牛与上一头牛距离大于d
num+=1; //成功计入
last=i; //更新比较位置
}
}
return num;
}
int binsearch(int left,int right,int c){ //二分答案函数
int ans;
while(left<=right){
int mid=(left+right)/2;
if (cnt(mid)>=c){ //大于说明当前距离d,能使更多牛塞入,所以向右找加大d
ans=mid;
left=mid+1;
}else{ //反之则减小距离
right=mid-1;
}
}
return ans; //因为若满足结果,则一直往右直到找到最优解,所以答案即为mid
}
int main(){
cin>>n>>c;
for (int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
int ans=binsearch(1,1e9,c);
cout<<ans;
return 0;
}