2015蓝桥杯初赛 c++组
[蓝桥杯2015初赛]方程整数解
n的范围在1到1e4,暴力求解即可
按照abc依次从小到大输出,所以可以abc依次遍历即可,简单C语言题
代码如下:
#include <bits/stdc++.h>
using namespace std;
int n;
int main(){
ios::sync_with_stdio(false);
while(cin>>n)
{ int a,b,c;
int f=0;
for(int i=1;i<sqrt(n);i++)
for(int j=i;j<sqrt(n);j++)
for(int k=j;k<sqrt(n);k++)
if(i*i+j*j+k*k==n)
{
f=1;
printf("%d %d %d\n",i,j,k);
}
if(f==0)
printf("No Solution\n");
}
}
[蓝桥杯2015初赛]星系炸弹
一到简单的模拟题,注意闰年的处理即可
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int main()
{
int leap[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
0,31,29,31,30,31,30,31,31,30,31,30,31};
int y,m,d;
int n;
while(scanf("%d %d %d %d",&y,&m,&d,&n)!=EOF){
while(n){
int t=((y%4==0&&y%100!=0)||(y%400==0));///判断闰年否
n--;
d++;
if(d>leap[t][m])///进入下一个月
{
m++;
d=1;
}
if(m==13)///进入下一年
{
y++;
m=1;
}
}
printf("%d-%02d-%02d\n",y,m,d);///答案的输出注意格式
}
}
[蓝桥杯2015初赛]奇妙的数字
平方和立方正好把0到9的数都用过一次,也就是说,数的位数不可能超过三位数,那么,我们在1到1000 的范围里暴力就行了
#include<bits/stdc++.h>
using namespace std;
const int N=1e3;
int a[10];
int kk(){///判断0-9是否都出现过
for(int i=0;i<10;i++)
{
if(a[i]!=1) return 0;
}
return 1;
}
int main()
{
for(int i=1;i<N;i++)
{ memset(a,0,sizeof(a));
int a1=i*i;
int a2=i*i*i;
while(a1>0){
a[a1%10]++;
a1=a1/10;
}
while(a2>0)
{
a[a2%10]++;
a2=a2/10;
}
if(kk()) {printf("%d",i); break;}
}
}
[蓝桥杯2015初赛]牌型种数
一道搜索题,首先牌的种类一共13种,每种最多4张,那么对每种牌的数量进行选取,最后可行的方案是每种牌的个数不超过4个,并且牌的种类不能超过13种,那么就可以了,我们进行13次搜索,每次对牌的个数进行从0到4的选取,代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e3;
int sum,ans;
void dfs(int k){///k代表的是选择的次数,选0也是选一次,最后一定要选满13次
if(k>13||sum>13) return;
if(sum==13&&k==13){ans++; return ;}
for(int i=0;i<5;i++){
sum+=i;
dfs(k+1);
sum-=i;
}
}
int main()
{
for(int i=0;i<5;i++)
{
sum+=i;
dfs(1);
sum-=i;
}
printf("%d",ans);
}
1254: [蓝桥杯2015初赛]手链样式
是一道字符串题,还是有一定难度的,需要会熟练的使用STL,首先就是题意的理解:
手链可以随意转动,也就是相当于1234和2341等等是一种组合,其次手链可以翻转,也就是说1234和1432和也是一种。
对于可以随意转动,我们复制字符串两段一样的拼成一段即可,对于可以翻转我们就用reverse函数把字符串翻转,再复制再拼成一段即可。然后所有出现过的情况用vector保存起来即可
对于如何遍历所有的情况,我们使用next_permutation即可
这道题,直接提交是会超时的,可是就这一组数据,且只要答案,那么直接提交输出答案的代码即可
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num=0;
vector<string>vis; //存已经计数过的玛瑙串
string str = "aaabbbbccccc";//表示玛瑙串
do
{
int has=0;
for(int i=0; i<vis.size(); i++)
{
if(vis[i].find(str)!=string::npos)///没找到的话返回string::npos
{
has=1;
break;
}
}
if(has==0)///没找到则进行添加
{
num++;
string tem=str;
tem=tem+tem;
vis.push_back(tem);
reverse(tem.begin(),tem.end());
vis.push_back(tem);
}
}
while(next_permutation(str.begin(),str.end()));
cout<<num<<endl;
}
1255: [蓝桥杯2015初赛]饮料换购
简单的模拟,三瓶换一瓶也就是每次会损失两瓶,这样操作一次会多喝一瓶,那么我们用n的值加上可以换购的次数即可
#include <iostream>
#include <cstring>
using namespace std;
int main(){
int n;
while(cin>>n){
int ans=n;
while(n>=3)
{
n-=2;
ans++;
}
printf("%d\n",ans);
}
}