暑期第二场-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;
}

N

posted @ 2018-07-28 23:23  浮生惘语  阅读(99)  评论(0编辑  收藏  举报