【思特奇杯·云上蓝桥-算法集训营】第1周

1题 跑步练习

3880

2题 阶乘约数

39001250856960000

3题 出栈次序

35357670

4.哥德巴赫分解

173

5.图书排列

479306

6.猴子分香蕉

3141

【分析】

1.跑步练习

第1分钟消耗600,第2分钟恢复300,即每2分钟消耗300。需要检查体力是否大于600,如果大于600,即可以完成一次循环;如果小于600,没有跑完1分钟体力就变0,所以也没办法休息。则直接计算还能跑多少秒。切忌用10000/300,因为要检查剩余体力是否大于600。

代码求解

#include<iostream>
using namespace std;
int solve(int n)
{
	int m=0;
	while(true)
	{    
		if(n>600)  //体力大于600,还能进行下一次循环 
		{
			n-=600;  //跑1分钟消耗600体力 
		}
		else{ //600/60 每秒钟消耗多少体力   n/(600/60) n体力能跑多少秒 
			return m+n/(600/60);  
		}
		n+=300;  //休息1分钟提升300体力 
		m=m+2*60;   //一个循环2分钟 
	}
 } 
 int main()
 {
 	cout<<solve(10000)<<endl;
 	return 0;
  } 
 

2题 阶乘约数

#include<iostream>
using namespace std;
const int M = 101;
long long a[M],b[M];
void init(int n){
	if(n<2)return;
	if(!a[n])for(int i=2;i*i<=n;i++){
		if(!(n%i)){
			init(i);
			init(n/i);
			return;
		}
	}
	a[n]++;
	return;
}
int main(){
	for(int i=2;i<M;i++)init(i);
	b[0]=1;
	for(int i=2;i<M;i++)if(a[i])
		for(int j=M-1;j>0;j--)
			b[j] += b[j-1]*a[i];
	long long ans = 0;
	for(int i=0;i<M;i++)ans+=b[i];
	cout << ans;
	return 0;
}

3题 出栈次序

#include<iostream>
using namespace std;
const int M = 16;
int ans(int a,int b){
	if(b==0)return 1;
	int t=0;
	for(int i=1;i<=a+1;i++){
		t += ans(i,b-1);
	}
	return t;
}
int main(){
	cout << ans(0,16);
	return 0;
}

4.哥德巴赫分解 

#include<iostream>
using namespace std;
const int M = 10000;
int ans=2;
int bo[M+1];
bool test(int x){
	if(bo[x])return bo[x]==1?true:false;
	for(int i=2;i*i<=x;i++){
		if(!(x%i)){
			bo[x]=2;
			return false;
		}
	}
	bo[x]=1;
	return true;
}
int main(){
	for(int i=4;i<=M;i+=2){
		for(int j=2;j+j<=i;j++)if(test(j)){
			if(test(i-j)){
				ans= ans<j ? j:ans;
				break;
			}
		}
	}
	cout<<ans;
	return 0;
}

6.猴子分香蕉

#include<iostream>
#include<limits.h>
using namespace std;

int main(){
	for(int i=6;i<INT_MAX;i++){
		if((i-1)%5!=0) continue;
		int m=i;
		m-=1; //吃掉一个
		m=m/5*4;
		if(m<=0||(m-2)%5!=0) continue;
		m-=2;
		m=m/5*4;
		if(m<=0||(m-3)%5!=0) continue;
		m-=3; 
		m=m/5*4;
		if(m<=0||(m-4)%5!=0) continue;
		m-=4; 
		m=m/5*4;
		if(m<=0||m%5!=0) continue;
	    cout<<i<<endl;
	    break;
	}
	return 0;
}

Excel地址

#include<iostream>
#include<string.h>
using namespace std;
long long n;
string tos(char c){
	string s;
	s += c;
	return s;
}
string res(long long x){
	if(x<26)return tos(char('A'+x%26));
	return res(x/26-1)+char('A'+x%26);
}
int main(){
	cin>>n;
	cout<<res(n-1);
	return 0;
}

10.日期问题

#include<cstdio>
#include<vector>
using namespace std;
int a[3];
const int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
struct Date{
	int a,b,c;
}d[3];
bool com(Date x,Date y){
	if(x.a!=y.a)return x.a<y.a;
	if(x.b!=y.b)return x.b<y.b;
	return x.c<y.c;
}
int main(){
	scanf("%d/%d/%d",&a[0],&a[1],&a[2]);
	d[0].a=a[0]+(a[0]<60?2000:1900),d[0].b=a[1],d[0].c=a[2];
	d[1].a=a[2]+(a[2]<60?2000:1900),d[1].b=a[0],d[1].c=a[1];
	d[2].a=a[2]+(a[2]<60?2000:1900),d[2].b=a[1],d[2].c=a[0];
	for(int i=0;i<3;i++){
		for(int j=i+1;j<3;j++){
			if(!com(d[i],d[j])){
				Date t=d[i];
				d[i]=d[j];
				d[j]=t;
			}
		}
	}
	for(int i=0;i<3;i++){
		printf("%d-%02d-%02d\n",d[i].a,d[i].b,d[i].c);
	}
	return 0;
}

11.整数划分

#include<iostream>
using namespace std;
const int M = 10005;
int min(int x,int y){return x<y?x:y;}

int dp(int n,int m){
	if(m<=1)return 1;
	int sum=0;
	for(int i=1;i<m;i++){
		sum += dp(n-i,min(n-1,i));
	}
	return sum;
}
int main(){
	int n;
	cin>>n;
	cout<<dp(n,n);
	return 0;
}

12.一步之遥

#include<iostream>
using namespace std;
const int M = 1000;
int ans = 999999;
int main(){
	for(int i=0;i<M;i++){
		for(int j=0;j<M;j++){
			if(i*97-j*127 == 1)ans = ans<(i+j)?ans:i+j;
		}
	}
	cout<<ans;
	return 0;
}

13.机器人塔

#include<iostream>
using namespace std;
 int n,m,sum,a[1010],n1,m1;  

 bool judge(int a[]){  
        int i=0;  
            for(int j=1;i+j<n+m;j++){//从第一行开始判断  
                for(int k=0;k<j;k++){//每行的个数  
                    if(a[i]==1){  
                        if(a[i+j]!=a[i+j+1]){  
                            return false;  
                        }  
                    }  
                    if(a[i]==2){  
                        if(a[i+j]==a[i+j+1]){  
                            return false;  
                        }  
                    }  
                    i++;  
                }  
            }  

        return true;      
    }  

  void A(int c[],int k){  
        if(k==n+m){  
            if(n1==n&&m1==m){  
                if(judge(c))  
                    sum++;                
            }  
        }else{  
        for(int i=1;i<=2;i++){  
                if(i==1){  
                    c[k]=i;  
                    n1++;  
                    A(c,k+1);  
                    n1--;  
                }  
                else if(i==2){  
                    c[k]=i;  
                    m1++;  
                    A(c,k+1);  
                    m1--;  
                }  

        }         
        }  
    }  



int main() {  
        cin>>n>>m;
        A(a,0);  
        cout<<sum<<endl;
        return 0;
    }  

14.七星填空

include<iostream>
#include<algorithm>
using namespace std;
int a[20]={1,2,3,4,5,7,8,9,10,12,13};
int main()
{
	do
	{
		int x1=a[0]+a[1]+a[2]+a[3];
		int x2=a[0]+a[4]+a[6]+a[9];
		int x3=6+a[1]+a[4]+14;
		int x4=6+a[2]+a[5]+11;
		int x5=a[3]+a[5]+a[7]+a[10];
		int x6=14+a[6]+a[8]+a[10];
		int x7=a[9]+a[8]+a[7]+11;
		if(x1==x2 && x1==x3 && x1==x4 && x1==x5 && x1==x6 && x1==x7)
		{
			for(int i=0;i<11;i++)
				cout<<a[i]<<" ";
			cout<<endl;
		}
	}while(next_permutation(a,a+10));
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值