《2015年蓝桥杯C++b组》

116 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第二天,点击查看活动详情

A-星系炸弹

题目描述

在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。 每个炸弹都可以设定多少天之后爆炸。 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。 有一个贝塔炸弹,a年b月c日放置,定时为n天,请你计算它爆炸的准确日期。

输入格式

输入存在多组数据,每组数据输入一行,每一行输入四个正整数a,b,c,n 输入保证日期在1000-01-01到2020-01-01之间,且日期合法。 n不超过1000

输出格式

请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19 请严格按照格式书写。不能出现其它文字或符号。

输入样例

2015 1 1 15 2014 11 9 1000

输出样例

2015-01-16 2017-08-05

数据范围与提示 题目已改编。

//这个题目很简单,就是计算日期模板吧,就可以算出来

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int sum=0;
    for(int i=10000;i<=99999;i++){
        int t=i;
        while(t){
            if(t%10==4){
                sum++;
                break;
            }
            t=t/10;
        }
    }
    cout<<99999 - 10000 + 1 - sum <<endl;
    return 0;
} 

B-牌型种数

题目描述

小明被劫持到X赌城,被迫与其他3人玩牌。 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序 自己手里能拿到的初始牌型组合一共有多少种呢?

输出格式

请输出该整数,不要输出任何多余的内容或说明文字。

//暴力,每人13张牌,不考虑花色,每张牌最少为0,最多为1

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
#define ll long long
const ll int N=1e9+7;
int ans=0;
int main(){
	for(int a1=0;a1<=4;a1++){
		for(int a2=0;a2<=4;a2++){
			for(int a3=0;a3<=4;a3++){
				for(int a4=0;a4<=4;a4++){
					for(int a5=0;a5<=4;a5++){
						for(int a6=0;a6<=4;a6++){
								for(int a7=0;a7<=4;a7++){
									for(int a8=0;a8<=4;a8++){
										for(int a9=0;a9<=4;a9++){
											for(int a10=0;a10<=4;a10++){
												for(int a11=0;a11<=4;a11++){
													for(int a12=0;a12<=4;a12++){
														for(int a13=0;a13<=4;a13++){
															if(a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13==13){
																ans++;
															}
		
	}	
	}	
	}	
	}	
	}	
	}	
	}	
	}
	}
	}
	}
	}
	}
	cout<<ans<<endl;
}//3598180

C-奖券数目

题目描述

有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。 某抽奖活动奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码。 主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。

输出格式

请提交该数字(一个整数),不要写任何多余的内容或说明性文字 //计算出带4的数字总和然后减去

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int sum=0;
    for(int i=10000;i<=99999;i++){
        int t=i;
        while(t){
            if(t%10==4){
                sum++;
                break;
            }
            t=t/10;
        }
    }
    cout<<99999 - 10000 + 1 - sum <<endl;
    return 0;
} 

D-三羊献瑞

题目描述

观察下面的加法算式:

image.png

其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

输出格式

请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

//这个题目其实特别简单,我们会发现一共有8个不相等的数字,两个四位数相加等于一个五位数,那么我们直接枚举就可以。我写的代码没有去掉首位(千位)为0的情况,所以运行结果出来,我们去掉首位(千位)为0的情况,我们会发现只有1085是满足条件的(写完这个代码,运行成功,结果正确,我顿时冒了一下冷汗,说实话没想到这样可以)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffff
int main()
{
   for(int a1=0;a1<=9;a1++){
   	for(int a2=0;a2<=9;a2++){
   	for(int a3=0;a3<=9;a3++){
   	for(int a4=0;a4<=9;a4++){
   	for(int a5=0;a5<=9;a5++){
   	for(int a6=0;a6<=9;a6++){
   	for(int a7=0;a7<=9;a7++){
   	for(int a8=0;a8<=9;a8++){
   	if((a1*1000+a2*100+a3*10+a4)+(a7*1000+a6*100+a5*10+a2)==(a7*10000+a6*1000+a3*100+a2*10+a8))
   	{
   		if(a1!=a2&&a1!=a3&&a1!=a4&&a1!=a5&&a1!=a6&&a1!=a7&&a1!=a8&&
		   a2!=a3&&a2!=a4&&a2!=a5&&a2!=a6&&a2!=a7&&a2!=a8&&
		   a3!=a4&&a3!=a5&&a3!=a6&&a3!=a7&&a3!=a8&&
		   a4!=a5&&a4!=a6&&a4!=a7&&a4!=a8&&
		   a5!=a6&&a5!=a7&&a5!=a8&&
		   a6!=a7&&a6!=a8&&
		   a7!=a8)
   	   cout<<a1<<a2<<a3<<a4<<"+"<<a7<<a6<<a5<<a2<<"="<<a7<<a6<<a3<<a2<<a8<<endl; 
   }
   }
   }
   }
   }
   }
   }
   }
   }
    return 0;
}

E-加法变乘法

题目描述

我们都知道:1+2+3+ … + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+…+1011+12+…+2728+29+…+49 = 2015 就是符合要求的答案。 请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交。 (对于示例,就是提交10)。

输出格式

注意:需要你提交的是一个整数,不要填写任何多余的内容。

//对不起了铁子们,我太菜了,这个题我还是暴力写出来的(暴力算是让我使明白了)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffff
int main() {
    /*int a[10],sum,t;
    for(int i=1; i<=49; i++) {//模拟第一次乘号的位置 
        for(int j=i+2; j<=49; j++) {//模拟第二次乘号的位置 
            sum=0,t=0;//sum求和 
            for(int k=1; k<=49; k++)//从1~49相加 
                if(k==i||k==j) {//乘号的位置 
                    a[t++]=(k-1);//存放乘号 
                    sum=sum-(k-1)+(k-1)*k;
                } else
                    sum+=k;
            if(sum==2015) {//满足条件 
                for(int i=0; i<t; i++)
                    cout<<a[i]<<" ";
            }
        }
    }//10 27 16 24*/
    cout<<16<<endl;
        return 0;
    }

F-移动距离题目描述

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。 其楼房的编号为1,2,3… 当排满一行时,从下一行相邻的楼往反方向排号。 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 4 5 6 12 11 10 9 8 7 13 14 15 … 我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离 (不能斜线方向移动)

输入格式

输入存在多组测试数据 输入为3个整数w m n,空格分开,都在1到10000范围内 w为排号宽度,m,n为待计算的楼号。

输出格式 要求输出一个整数,表示m n 两楼间最短移动距离。 输入样例

6 8 2 4 7 20 输出样例

4 5

//这个题目算是规律题吧,对除以W可以求出距离第一行的距离(判断距离第一行的距离时,需要减一, 例如w为6 ,n为6 n/w=1,但其实他离第一行的距离是0),然后判断距离是奇数还是偶数。找出奇数行、偶数行到最右边的距离规律

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main() {
	int w,m,n;
	int x1,y1;
	int x2,y2;
	while(cin>>w>>m>>n) {
		x1=(m-1)/w;//判断m距离第一行的距离 
		x2=(n-1)/w;//判断n距离第一行的距离 
		if(x1%2!=0) y1=m%w-1;//m在奇数行到最右边的距离 
		else y1=w-m%w;//m在偶数行到最右边的距离 
		if(x2%2!=0) y2=n%w-1;//n在奇数行到最右边的距离 
		else y2=w-n%w;//n在偶数行到最右边的距离 
		  cout<<abs(x1-x2)+abs(y1-y2)<<endl;
		  //上下相减求差值加上左右相减取差值 
	}
	return 0;
}