WEEK_1(基础)

目录

P8682 等差数列

P1226 快速幂

P2249 查找

P1824 进击的奶牛


P8682 等差数列

一开始看到这个题目想的是先把排个序,然后算出相邻两项之间的差,将这些差排序,

再对每个差mod最小的差,一旦有不能将最小差整除的就不符合,最小公差只能为1

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int main()
{
	int n;
	cin>>n;
	int num[N];
	memset(num,0,sizeof(num));
	for(int i=0;i<n;i++)
	cin>>num[i];
	sort(num,num+n);
	int maxx=num[n-1],minn=num[0];
	int dx[N];
	for(int i=0;i<n-1;i++)
	dx[i]=num[i+1]-num[i];
	sort(dx,dx+n-1);
	int dd=dx[0],f=1;
	if(dd==0)
	{
		cout<<n;
		return 0;
	}
	for(int i=n;i>=1;i--)
	if(dx[i]%dd!=0)
	f=0;
	if(f==1)
	cout<<(maxx-minn)/dd+1;
	else
	cout<<maxx-minn+1;
	return 0;
}

。。。。。尊嘟是第一反应。。。。

结果后来看看佬的代码,发现这原来是最小公差,所以优化了一下下(找所有差的最小公约数

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int gcd(int x,int y)
{
	if(y==0)
	return x;
	return gcd(y,x%y);
}
int main()
{
	int n;
	cin>>n;
	int num[N];
	memset(num,0,sizeof(num));
	for(int i=0;i<n;i++)
	cin>>num[i];
	sort(num,num+n);
	int d=num[1]-num[0];
	for(int i=0;i<n-1;i++)
	d=gcd(d,num[i+1]-num[i]);
	if(d==0)
	cout<<n;
	else
	cout<<(num[n-1]-num[0])/d+1;
	return 0;
}

win!!


P1226 快速幂

这题。。额。。根本就不能直接暴力……

疯狂取模。。函数里最后一下不模过不了~~

思路嘛,酱紫的嘞

每次把n给除2,如果n是偶数,a(a^b)直接平方,如果n是奇数,就把得到的结果再乘个a

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll p;
ll fp(ll a,ll n)
{
	if(n==1)
	return a;
	int s=fp(a,n/2);
	if(n%2==0)
	return ((s%p)*(s%p))%p;
	else
	return ((((s%p)*(s%p))%p)*(a%p))%p;
}
int main()
{
	ll a,b,ans;
	cin>>a>>b>>p;
	ans=a;
	cout<<a<<"^"<<b<<" mod "<<p<<"=";
	cout<<fp(a,b)%p;
	return 0;
}

P2249 查找

一开始用lower_bound写结果没写出来。。

索性老老实实打二分代码

因为数据本身就是单调,所以从中间开始找,大了就往右找,小了就往左找,然后一直找下去~~

#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
int num[N];
int search(int sea,int l,int r)
{
	int f=-1,mid;
	while(l<r)
	{
		mid=l+(r-l)/2;
		if(num[mid]>=sea)
		r=mid;
		else
		l=mid+1;
	}
	if(num[l]==sea)
	f=l;
	return f;
}
int main()
{
	int n,m,fd;
	cin>>n>>m;
	int sea;
	memset(num,0,sizeof(num));
	for(int i=1;i<=n;i++)
	cin>>num[i];
	for(int i=0;i<m;i++)
	{
		cin>>sea;
		cout<<search(sea,1,n)<<" ";
	}
	return 0;
}

P1824 进击的奶牛

这题。。无语

开始看半天没看明白。。“最近距离越大越好”,“最大的最近距离”。。。人傻了有木有

结果回去后一想就明白了,意思就是把距离分成两部分,l~mid和mid~r,然后用mid去找这个距离,每次找的时候判断与前一个牛棚的距离是否满足要求(>=mid),若满足,就跳到下一个牛棚的坐标,于是能放的奶牛数量就加一,多了可以,少了就不可以,即最优解一定行,但可行解不一定最优,所以每次缩小范围,直到找到那啥“最大的最近距离”(写这么多只要是不想有人看不懂题目了。。。真的会谢啊啊啊啊啊啊啊!!!)

代码如下

#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
int n,c,x[N];
bool check(int m)
{
	int ans=1,p=1,k,q=x[1];
	for(int i=2;i<=n;i++)
	{
		k=x[i]-q;
		if(k>=m)
		{
			ans++;
			q=x[i];
		}
	}
	if(ans<c)
	return true;
	else
	return false;
}
int main()
{
	cin>>n>>c;
	memset(x,0,sizeof(x));
	for(int i=1;i<=n;i++)
	cin>>x[i];
	sort(x+1,x+1+n);
	int l=1,r=x[n]-x[1],mid;
	while(l<=r)
	{
		mid=(r+l)/2;
		if(check(mid))
		r=mid-1;
		else
		l=mid+1;
	}
	cout<<r;
	return 0;
}

记录第一次写博客!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值