NEUQ-ACM 必做题 week1

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; 
} 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值