NEUQ-ACM week1

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;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值