P8682 [蓝桥杯 2019 省 B] 等差数列
思路:
1.用数组存储数列数据,并用sort函数进行排序
2. 遍历输出数字间隔最小的差值
3.个数=(最大-最小)/差值+1
ps:要考虑差值为0的特殊情况
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[100000];
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int m=a[1]-a[0];
for(int j=1;j<n-1;j++){
if(a[j+1]-a[j]<m){
m=a[j+1]-a[j];
}
}
int x;
if(m==0){
x=n;
}
else{
x=(a[n-1]-a[0])/m+1;
}
cout<<x;
}
P1226 【模板】快速幂
思路:
1.若指数y转化为二进制,每一位若为1则代表要乘一次p(一开始为底数),若为0则代表不需
2.每一次y位运算向右移一位,同时p*p,再判断最后一位是否为1。直至y为0停止
3.同时为了在防止数字过大的前提下取得余数,结合取余运算
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
long long int a,b,p,x,y,z=1;
cin>>a>>b>>p;
x=a,y=b;
while(y!=0){
if(y&1){
z=(z%p)*(x%p);
z%=p;
}
x=(x%p)*(x%p)%p;
y>>=1;
}
z=z%p;
cout<<a<<"^"<<b<<" mod "<<p<<"="<<z;
}
P2249 【深基13.例1】查找
思路:
1.用数组存储数列数据,因为单调不减每个数字直接可以通过二分查找
2.因为要求取第一个数的位置,所以注意查找判断条件
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
long long int m,n,x;
cin>>n>>m;
int mid;
long long int a[1000002];
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int j=1;j<=m;j++){
cin>>x;
int p=1,q=n;
while(p<q){
mid=(p+q)/2;
if(a[mid]>=x){
q=mid;
}
else{
p=mid+1;
}
}
if(a[p]==x){
cout<<p<<" ";
}
else{
cout<<"-1 ";
}
}
}
P1824 进击的奶牛
思路:
1.用数组存储房间坐标数据,并对进行升序排序
2.可以把相邻两头牛的最小距离看作一个从可能最大到最小1的数列,然后进行二分答案判断找到最小值
3.二分答案判断:通过遍历房间坐标放牛,判断这个间隔是否可能实现(pan函数)
代码:
#include<bits/stdc++.h>
using namespace std;
long long int a[100002];
int n,c;
bool pan(int l){
int x=a[0];
int s=0;
for(int i=1;i<n;i++){
if(a[i]-x<l){
s++;
}
else{
x=a[i];
}
if(n-c<s){
return false;
}
}
return true;
}
int main(){
cin>>n>>c;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int p=1,q=a[n-1]-a[0];
while(p+1<q){
int mid=(q+p)/2;
if(pan(mid)){
p=mid;
}
else{
q=mid;
}
}
if(pan(q)){
cout<<q;
}
else if(pan(p)){
cout<<p;
}
}