目录
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;
}
记录第一次写博客!!!