问题 A: 木棒根数
解法:把所有的情况保存下来,加一下就好
#include<bits/stdc++.h> using namespace std; map<char,int>q; class P { public: int cmd(string s) { int sum=0; for(int i=0;i<s.length();i++) { sum+=q[s[i]]; } return sum; } }; int main() { string s; P solve; q['0']=6; q['1']=2; q['2']=5; q['3']=5; q['4']=4; q['5']=5; q['6']=6; q['7']=3; q['8']=7; q['9']=6; q['+']=2; q['-']=1; q['=']=2; cin>>s; cout<<solve.cmd(s)<<endl; return 0; }
问题 B: 一个苹果都不给我
解法:三种情况,单独买,套装买,和混合买
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { int n,m,p,q,ans[5]; cin>>n>>m>>p>>q; ans[0]=n*m; ans[1]=n/p*q+(n%p)*m; ans[2]=(n/p+1)*q; sort(ans,ans+3); cout<<ans[0]<<endl; return 0; }
问题 C: LED
解法:保存图形,然后xjb搞
include<stdio.h> #include<string.h> int main() { char num1[50]={" _ _ _ _ _ _ _ _ "}; char num2[50]={"| | | _| _||_||_ |_ ||_||_|"}; char num3[50]={"|_| ||_ _| | _||_| ||_| _|"}; char str,a[50]={"\0"}; int i,k,j,len; scanf("%s",a); len=strlen(a); for(i=0;i<len;++i) { j=a[i]-'0'; k=j*3; printf("%c%c%c",num1[k],num1[k+1],num1[k+2]); } printf("\n"); for(i=0;i<len;++i) { j=a[i]-'0'; k=j*3; printf("%c%c%c",num2[k],num2[k+1],num2[k+2]); } printf("\n"); for(i=0;i<len;++i) { j=a[i]-'0'; k=j*3; printf("%c%c%c",num3[k],num3[k+1],num3[k+2]); } printf("\n"); return 0; }
问题 D: 路是自己选的
解法:应该都看出奇偶性关系了,一种是利用二进制,一种是二分,结果需要倒过来输出,所以使用了栈
#include<bits/stdc++.h> using namespace std; const int MAXN=1000005; int b[MAXN]; int main() { int x; int a[100]; scanf("%d",&x); for(int i=0;i<64;i++) { scanf("%d",&a[i]); b[a[i]]=i; } int u=b[x]; u=64+u; stack<char> s; while(u!=1) { if(u%2==0) s.push('L');else s.push('R'); u=u/2; } while(!s.empty()) { putchar(s.top()); s.pop(); } puts(""); return 0; }
问题 E: All roads lead to rome
解法:标准解法是dp,然而可以用组合数学来做,也就是C(n,m)
#include <iostream> #include <cmath> using namespace std; int main(){ int n,m,l,r; int a,b,c,d,ans=1; cin>>n>>m>>a>>b>>c>>d; l=abs(a-c),r=abs(d-b); for(int i=l+r;i>l;i--){ ans=ans*i/(l+r-i+1); } cout<<ans<<endl; }
问题 F: 找不到北
解法:求最短路最好利用bfs,当然dfs也能做到(一道基础的搜索题)
#include<bits/stdc++.h> using namespace std; int inf=(1<<31)-1; int Mx; char m[12][12]={ "##########", "#**#***#*#", "#*#**##*##", "#***##***#", "##**#*#**#", "#***#*#**#", "#**#*****#", "#****###*#", "#***#**#*#", "##########", }; int a,b,c,d; void dfs(int x,int y,int s) { if(m[x][y]=='#') { return; } else if(x==c&&y==d) { Mx=min(Mx,s); } s++; m[x][y]='#'; dfs(x,y-1,s); dfs(x,y+1,s); dfs(x+1,y,s); dfs(x-1,y,s); m[x][y]='*'; } int main() { int t; cin>>t; while(t--) { Mx=inf; cin>>a>>b>>c>>d; if(m[a][b]=='#'||m[c][d]=='#') { cout<<"-1"<<endl; continue; } else if(a==c&&b==d) { cout<<"0"<<endl; continue; } else { dfs(a,b,0); if(Mx==inf) { cout<<"-1"<<endl; } else { cout<<Mx<<endl; } } } return 0; }