zoukankan      html  css  js  c++  java
  • 暑期第二场-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

  • 相关阅读:
    静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
    编写多线程程序有几种实现方式?
    文件拷贝
    如何实现对象克隆?
    c#如何保存richtextbox的rtf格式
    C#实现文件与二进制互转并存入数据库
    c#中绝对路径和相对路径
    C#实现MySQL数据库中的blob数据存储
    CSS控制文字,超出显示省略号
    ES6 语句判断简写
  • 原文地址:https://www.cnblogs.com/aerer/p/9931029.html
Copyright © 2011-2022 走看看