暑期第二场-1
G
这题坑不少,我也翻车好几次,说一说几个注意事项
1.最终次数要加上本身,即运算了2次,再加上本身就是3次
2.要考虑为0和1时的情况,次数为0,加上本身情况就是1次
3.要考虑l>r的情况,但是你不能判断后交换,因为最后要原样输出l和r。大概就这几点,既可以打表也可以用函数
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
int main()
{
int js(int a);
int l,r,t;
while(cin>>l>>r)
{
int maxn=0;
for(int i=min(l,r);i<=max(l,r);++i){
t = js(i);
if(t > maxn){
maxn=t;
}
}
cout<<l<<" "<<r<<" "<<maxn<<endl;
}
return 0;
}
int js(int a)
{
int count=0;
if(a==0||a==1)
count=0;
while(a!=1)
{
if(a%2==0)
a/=2;
else
a=a*3+1;
++count;
}
return ++count;
}
H
思路:此题暴力是万万不行的,刚开始用的是大数相乘来做的,可惜没过,后来才知道要用斯特林公式,我就总结了一下公式,点击打开链接,希望能好好看看这个链接,上代码
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#define pi 3.1415926
#define e 2.718281828459
using namespace std;
int main()
{
int n;
cin>>n;
int p=1/2.0*log10(2*pi*n)+n*log10(n)-n*log10(e)+1;
cout<<p<<endl;
return 0;
}
I
此题主要考察中国剩余定理,点击了解中国剩余定理,和扩展欧几里得如果看不懂就多在网上找几篇博客,看懂后记住模板,练习几道类似的就大概掌握了
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int a[3],m[3]={23,28,33};
int exgcd(int a,int b,int &x,int &y) //扩展欧几里得
{ if (b==0)
{ x=1,y=0;
return a;
}
int q=exgcd(b,a%b,y,x);
y-=a/b*x;
return q;
}
int CRT(int a[],int m[],int n) //中国剩余定理
{
int M = 1;
int ans = 0;
for(int i=0; i<n; i++)
M *= m[i];
for(int i=0; i<n; i++)
{
int x, y;
int Mi = M / m[i];
exgcd(Mi, m[i], x, y);
ans = (ans + Mi * x * a[i]) % M;
}
return (ans+M)%M;
}
int main()
{
int p, e, i, d, t = 1;
while(cin>>p>>e>>i>>d)
{
if(p == -1 && e == -1 && i == -1 && d == -1)
break;
a[0] = p;
a[1] = e;
a[2] = i;
int ans = CRT(a, m, 3);
if(ans <= d)
ans += 21252;
cout<<"Case "<<t++<<": the next triple peak occurs in "<<ans - d<<" days."<<endl;
}
return 0;
}
J
思路:此题暴力会超时,感觉跟贪心差不多,具体解释看代码吧
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 50001 //宏定义,大数组也要定义成全局变量
long a[maxn];
int main()
{
long n,k;
cin>>k>>n;
for(long i=0;i<n;i++)
cin>>a[i];
sort(a,a+n); //将其从小到大排序
long i=0,j=n-1; //一个从头开始,一个从尾开始
bool lag=true; //用于判断是否有解
while(i<j) //如果i=j,证明循环也就结束了
{
if(a[i]+a[j]==k) //如果满足条件,就输出
{
cout<<a[i]<<" "<<a[j]<<endl;
i++;j--; //并且都指向下一位
lag=false;
}
else if(a[i]+a[j]<k) //如果小于k,因为从大到小排序,所以找i后面比它大的继续
i++;
else //同样,大于k就让j-1
j--;
}
if(lag) //无解的话输出
cout<<"No Solution"<<endl;
return 0;
}
K
L
M
快速幂,刚开始一脸懵逼,两脸懵逼,后来去看了下快速幂,又做了好几道题,记的挺死,点击打开链接,这是总结了一下
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
long powermod(long long a,long long b,long long c);
long long a,b,c;
cin>>a>>b>>c;
cout<<powermod(a,b,c)<<endl;
return 0;
}
long powermod(long long a,long long b,long long c)
{
long ans=1;
a%=c;
while(b>0)
{
if(b%2==1)
ans=(ans*a)%c;
b/=2;a=(a*a)%c;
}
return ans;
}