2018
第一题
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
long x=pow(2,19);
printf("%d/%d",x*2-1,x);
return 0;
}
答案:1048575/524288
第二题
蓝桥杯好像很喜欢考闰年相关的题....
闰年分为普通闰年和世纪闰年:
普通闰年:能被4整除但是不能被100整除
世纪闰年:能被400整除
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int d=0;
for(int i=1901;i<=2000;++i){
if((i%4==0&&i%100!=0)||(i%400==0)){
d+=366;
}else d+=365;
}
printf("%d",d/7);
return 0;
}
答案:5217
第三题
给定一堆数相乘,问结尾有多少个0
由于一个0由一个2和一个5组成,所以只需求这些数里2和5的总个数取最小值即可
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int num2=0,num5=0,temp;
for(int i=0;i<100;++i){
cin>>temp;
while(temp%2==0){
temp/=2;
num2++;
}
while(temp%5==0){
temp/=5;
num5++;
}
}
cout<<min(num2,num5);
return 0;
}
答案:31
第四题
与丑数类似,dp即可
但是反正代码又不提交,暴力解决也行
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll minest(ll a,ll b,ll c){
return min(min(a,b),c);
}
int main()
{
ll temp;
int p3=0,p5=0,p7=0;
cin>>temp;
ll dp[10000];
dp[0]=1;
for(int i=1;i<3000;++i){
dp[i]=minest(dp[p3]*3,dp[p5]*5,dp[p7]*7);
if(dp[i]==dp[p3]*3)p3++;
if(dp[i]==dp[p5]*5)p5++;
if(dp[i]==dp[p7]*7)p7++;
if(dp[i]==temp){
cout<<i;
return 0;
}
}
return 0;
}
答案:1905
第五题
肯定和size有关,莽就是了
答案:size/3
第六题
简单的模拟,对经历过pat的人来说不算啥的啦~
把来回的用时相加除以二就是答案了
#include <stdio.h>
#include <iostream>
#define charToNum(x) (x-'0')
using namespace std;
int main()
{
int N;
scanf("%d",&N);
for(int i=0;i<N;++i){
char c;
int sum;
int h1,m1,s1,t1;
int h2,m2,s2,t2;
scanf("%d:%d:%d",&h1,&m1,&s1);
scanf("%d:%d:%d",&h2,&m2,&s2);
t1=h1*3600+m1*60+s1;
t2=h2*3600+m2*60+s2;
while((c=getchar())!='\n'){
if(c=='1'||c=='2'||c=='3'){
t2+=charToNum(c)*24*3600;
}
}
int h3,m3,s3,t3;
int h4,m4,s4,t4;
scanf("%d:%d:%d",&h3,&m3,&s3);
scanf("%d:%d:%d",&h4,&m4,&s4);
t3=h3*3600+m3*60+s3;
t4=h4*3600+m4*60+s4;
while((c=getchar())!='\n'){
if(c=='1'||c=='2'||c=='3'){
t4+=charToNum(c)*24*3600;
}
}
sum=(t2+t4-t1-t3)/2;
printf("%02d:%02d:%02d\n",sum/3600,(sum%3600)/60,sum%3600%60);
}
return 0;
}
题目七
网上好像说满分要用线段树?先溜了溜了
第九题
暴力解法...应该是拿不了满分的
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int n,k,max=0,sum;
int save[100000];
scanf("%d%d",&n,&k);
for(int i=0;i<n;++i){
scanf("%d",&save[i]);
}
for(int i=0;i<n;++i){
for(int j=i+1;j<n;++j){
for(int k=j+1;k<n;++k){
sum=save[i]+save[j]+save[k];
if(sum%k==0&&sum>max){
max=sum;
}
}
}
}
printf("%d",sum);
return 0;
}
2017
第一题
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;
int cnt=0;
bool vis[10][10];
string pather[10];
void dfs(int x,int y){
if(x<0||x>9||y<0||y>9){
cnt++;
return;
}
if(vis[x][y])return;
vis[x][y]=true;
if(pather[x][y]=='L')y--;
else if(pather[x][y]=='R')y++;
else if(pather[x][y]=='U')x--;
else if(pather[x][y]=='D')x++;
dfs(x,y);
}
int main() {
char c;
for(int i=0;i<10;++i){
cin>>pather[i];
}
for(int i=0;i<10;++i){
for(int j=0;j<10;++j){
memset(vis,0,sizeof(vis));
dfs(i,j);
}
}
cout<<cnt;
return 0;
}
答案:31
2016
第一题
枚举一下即可
答案:7
#include <iostream>
using namespace std;
int main() {
int father=28;
int son=1,cnt=0;
for(;father<99;father++,son++){
if(father%10==son/10&&father/10==son%10){
cnt++;
}
}
cout<<cnt;
return 0;
}
第二题
枚举就行了 答案为26
#include <iostream>
using namespace std;
int main() {
int age=1,flag;
for(;age<=100;age++){
for(int i=1;i<=age;++i){
int sum=0;
for(int j=i;j<=age;++j){
sum+=j;
}
if(sum==236){
cout<<i;
return 0;
}
}
}
return 0;
}
第六题
答案:64
#include <iostream>
#include <string.h>
using namespace std;
int main() {
int cnt=0;
for(int i=1;i<13;++i){
for(int j=i+1;j<=13;++j){
bool vis[14];
if(i+j<=13){
vis[i]=true,vis[j]=true,vis[i+j]=true;
for(int k=1;k<13;++k){
for(int m=k+1;m<=13;++m){
if(!vis[k]&&!vis[m]&&!vis[m-k]&&m-k!=k){
vis[m]=true,vis[k]=true,vis[m-k]=true;
for(int t=1;t<13;++t){
for(int z=t+1;z<=13;++z){
if(!vis[t]&&!vis[z]&&t*z<=13&&!vis[t*z]&&t*z!=t&&t*z!=z){
vis[t]=true,vis[z]=true,vis[t*z]=true;
for(int s=1;s<13;++s){
for(int y=s+1;y<=13;++y){
if(!vis[s]&&!vis[y]&&y%s==0&&!vis[y/s]&&y/s!=s&&y/s!=y){
cout<<i<<" "<<j<<" "<<j-i<<" "<<k<<" "<<m<<" "<<m-k<<" "<<t<<" "<<z<<" "<<t*z<<" "<<s<<" "<<y<<" "<<y/s<<endl;
cnt++;
}
}
}
vis[t]=false,vis[z]=false,vis[t*z]=false;
}
}
}
vis[m]=false,vis[k]=false,vis[m-k]=false;
}
}
}
vis[i]=false,vis[j]=false,vis[i+j]=false;
}
}
}
cout<<cnt*4;
return 0;
}
第八题
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
void solve(int n){
for(int i=0;i*i<=n;++i){
int n1=n-i*i;
for(int j=0;j*j<=n1;++j){
int n2=n1-j*j;
for(int k=0;k*k<=n2;++k){
int n3=n2-k*k;
int l=sqrt(n3);
if(l*l==n3){
printf("%d %d %d %d",i,j,k,l);
return;
}
}
}
}
}
int main() {
int n;
scanf("%d",&n);
solve(n);
return 0;
}
第九题
#include <iostream>
#include <math.h>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s1,s2;
cin>>s2;
s1=s2;
reverse(s2.begin(),s2.end());
int dp[100][100];
for(int i=0;i<10;++i){
dp[i][0]=0;
dp[0][i]=0;
}
int n=s1.length();
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(s1[i-1]==s2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
printf("%d",n-dp[n][n]);
return 0;
}
2015
第一题
答案:10
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
for(int i=1;i<100;++i){
for(int j=i+1;j<100;++j){
for(int k=j+1;k<100;++k){
if(i*i+j*j+k*k==1000){
cout<<i<<endl;
}
}
}
}
return 0;
}
第二题
直接excel操作就行了
=A1+1000
第三题
大概估算下数字的范围再枚举即可,答案:69
#include <iostream>
using namespace std;
void solve(int x){
int b[10]={0};
int a=x*x;
int c=x*x*x;
while(a){
if(b[a%10]==0){
b[a%10]++;
a/=10;
}else{
return;
}
}
while(c){
if(b[c%10]==0){
b[c%10]++;
c/=10;
}else{
return;
}
}
for(int i=0;i<10;++i){
if(!b[i])return;
}
cout<<x<<endl;
}
int main(int argc, char** argv) {
int x=10;
for(;x<100;++x){
solve(x);
}
return 0;
}
第六题
dfs即可,记得return得条件为depth==14
而不是13
答案:3598180
#include <iostream>
using namespace std;
int cnt=0;
int card[15];
void dfs(int last,int depth){
if(depth==14){
cnt++;
return;
}
for(int i=last;i<=13;++i){
if(card[i]<4){
card[i]++;
dfs(i,depth+1);
card[i]--;
}
}
}
int main(int argc, char** argv) {
dfs(1,1);
cout<<cnt;
return 0;
}
第八题
#include <iostream>
using namespace std;
int buy;
void ans(int num){
if(num/3==0){
return;
}
buy+=num/3;
return ans(num/3+num%3);
}
int main(int argc, char** argv) {
cin>>buy;
ans(buy);
cout<<buy;
return 0;
}
2013
第一题
答案:1799-7-16
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
int day=8113,i;
for(i=1777;day>=365;++i){
if((i%4==0&&i%100!=0)||i%400==0){
day-=366;
}else{
day-=365;
}
}
cout<<i<<endl<<day;
return 0;
}
第二题
答案:639172
#include <iostream>
#include <string.h>
using namespace std;
bool hs[10];
bool isok(long long x){
memset(hs,0,sizeof(hs));
while(x){
if(!hs[x%10]){
hs[x%10]=true;
x/=10;
}else{
return false;
}
}
return true;
}
int main(int argc, char** argv) {
long long temp=100000,ans;
for(;temp<999999;temp++){
if(isok(temp)){
bool flag=true;
ans=temp*temp;
while(ans&&flag){
if(hs[ans%10]){
flag=false;
}else{
ans/=10;
}
}
if(flag){
cout<<temp<<endl;
}
}
}
return 0;
}
第三题
dfs,答案:35
#include <iostream>
using namespace std;
int cnt=0;
int a[4][5]={{0,1,2,3,4},{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
void dfs(int x,int y){
if(x==3&&y==4){
cnt++;
return;
}
if(x!=3){
if(a[x+1][y]==a[x][y]+1)
dfs(x+1,y);
}
if(y!=4){
if(a[x][y+1]==a[x][y]+1)
dfs(x,y+1);
}
}
int main(int argc, char** argv) {
dfs(0,0);
cout<<cnt;
return 0;
}
第五题
答案:9088
#include <iostream>
#include <vector>
#include <map>
using namespace std;
struct k{
int price,ans,cut;
};
vector<k> more,les;
map<int,int> hs;
bool isok(int x){
for(int i=0;i<4;++i){
if(x%10==1||x%10==2||x%10==5||x%10==6||x%10==8||x%10==9||(i!=0&&x%10==0)){
x/=10;
}else{
return false;
}
}
return true;
}
int main(int argc, char** argv) {
hs[1]=1,hs[2]=2,hs[5]=5,hs[9]=6,hs[8]=8,hs[6]=9,hs[0]=0;
for(int i=1000;i<10000;++i){
if(isok(i)){
int ans=hs[i%10]*1000+hs[i%100/10]*100+hs[i%1000/100]*10+hs[i/1000];
if(i-ans>200&&i-ans<300)les.push_back({i,ans,ans-i});
if(ans-i>800&&ans-i<900)more.push_back({i,ans,ans-i});
}
}
for(int i=0;i<les.size();++i){
for(int j=0;j<more.size();++j){
if(more[j].cut+les[i].cut==558){
cout<<les[i].price<<endl;
}
}
}
return 0;
}
网友评论