文章目录
蓝桥-历届试题
PREV-1 核桃的数量 最小公倍数
#include<iostream>
#include<cmath>
using namespace std;
int find(int a,int b){
int ans,tmp=1,t,p;
if(a>b) {t=b; p=a;}
if(a<=b) {t=a; p=b;}
if(p%t==0) ans=p;
else{
for(int i=2;i<=t;i++){
if(a%i==0&&b%i==0) tmp=i;
}
ans=a*b/tmp;
}
return ans;
}
int main(){
int a,b,c;
ios::sync_with_stdio(false);
cin>>a>>b>>c;
cout<<find(find(a,b),c);
return 0;
}
PREV-2 打印十字图
#include<stdio.h>
int main()
{
int m,i,j,n,k;
scanf("%d",&n);
k=n;
n=n*4+5;
char a[130][130];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
a[i][j]='.';
}
for(m=1;m<=(k+1);m++){//实际比原来多一层;
for(i=m*2+1;i<=n-m*2;i++)
for(j=1+m*2-2;j<=n-(m*2-2);j++)
a[i][j]='$',a[j][i]='$';//对称性质;
for(i=1+m*2+1;i<=n-(2*m+1);i++)
for(j=m*2;j<=n-(m*2-1);j++)
a[i][j]='.',a[j][i]='.';
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
printf("%c",a[i][j]);
printf("\n");// 输出
}
return 0;
}
PREV-3 带分数
#include<bits/stdc++.h>
using namespace std;
int vis[15],old[15];
bool check(int x){
while(x){
int tmp=x%10;
if(tmp==0) return false;
vis[tmp]++;
x/=10;
}
return true;
}
bool checkOk(){
if(vis[0]!=0) return false;
for(int i=1;i<=9;i++){
if(vis[i]!=1) return false;
}
return true;
}
int main(){
int left,up,down;
ios::sync_with_stdio(false);
int n;
cin>>n;
int cnt=0;
for(left=1;left<n;left++){
memset(vis,0,sizeof(vis));
if(!check(left)) continue;
for(down=1;down<=10000;down++){
memcpy(old,vis,sizeof(vis));
if(!check(down)){
memcpy(vis,old,sizeof(vis));
continue;
}
up=(n-left)*down;
if(!check(up)){
memcpy(vis,old,sizeof(vis));
continue;
}
if(!checkOk()){
memcpy(vis,old,sizeof(vis));
continue;
}
memcpy(vis,old,sizeof(vis));
cnt++;
}
}
cout<<cnt;
return 0;
PREV-4 剪格子 dfs ☆
#include<bits/stdc++.h>
using namespace std;
int a[15][15]={0};
int vis[15][15]={0};
int to[8][2]={-1,0,1,0,0,1,0,-1,1,1,1,-1,-1,1,-1,-1}; //可以向八个方向移动
int ans;
int m,n;
int aim=0;
int dfs(int x,int y,int ct){
if(ct==aim) return 1;
int ans=0;
for(int i=0;i<8;i++){
int tx=x+to[i][0];
int ty=y+to[i][1];
if(tx>=0&&tx<n&&ty>=0&&ty<m){
if(!vis[tx][ty]&&a[tx][ty]+ct<=aim){
vis[tx][ty]=1;
ans=dfs(tx,ty,a[tx][ty]+ct);
if(ans)
return ans+1;
vis[tx][ty]=0;
}
}
}
return 0;
}
int main(){
ios::sync_with_stdio(false);
cin>>m>>n;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
cin>>a[i][j];
aim+=a[i][j];
}
if(aim%2){
cout<<0<<endl;
}
else{
aim/=2;
vis[0][0]=1;
cout<<dfs(0,0,a[0][0]);
}
return 0;
}
PREV-5 错误票据 输入处理 ☆
solution-1 TLE
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[100005]={0};
int N;
scanf("%d",&N);
int t;
int min1=100005;
getchar(); //吞掉多余的第一个回车
for(int i=0;i<N;){
t=getchar();
if(t>='0'&&t<='9'){
ungetc(t,stdin); //将你读到的字符回退到输入流中
int num;
scanf("%d",&num);
a[num]++;
min1=min(num,min1);
}
else if(t=='\n') i++;
}
int cnt=0;
int n,m;
for(;;min1++){
if(a[min1]==0){
n=min1;
cnt++;
}
else if(a[min1]==2){
m=min1;
cnt++;
}
if(cnt==2) break;
}
printf("%d %d",n,m);
return 0;
}
solution-2 AC
//运用getline(cin,str) 和 stringstream
#include<bits/stdc++.h>
using namespace std;
int toInt(string word){
int len=word.length();
int x=0;
for(int i=0;i<len;i++)
{
x*=10;
x=(x+word[i]-'0');
}
return x;
}
int main(){
int num[100005]={0};
int n;
string s;
int min1=100005;
cin>>n;
getchar();
for(int i=0;i<n;i++) {
getline(cin,s);
stringstream line;
line<<s;
while(line){
string word;
line>>word;
int x=toInt(word);
if(x!=0){
min1=min(x,min1);
num[x]++;
}
}
}
int a,b;
int cnt=0;
for(;;min1++){
if(num[min1]==0) {a=min1; cnt++;}
if(num[min1]==2) {b=min1; cnt++;}
if(cnt==2) break;
}
cout<<a<<" "<<b;
return 0;
}
PREV-6 翻硬币 贪心
*#include<bits/stdc++.h>
using namespace std;
string a,b;
//处理string类型里面的char 必须要用 (char &p)
void rev(char &p){
if(p=='o') p='*';
else if(p=='*') p='o';
}
int main(){
int ans=0;
cin>>a>>b;
int len=a.length();
for(int i=0;i<len;i++){
if(a[i]!=b[i]){
ans++;
rev(a[i]);
rev(a[i+1]);
}
}
cout<<ans;
return 0;
}
PREV-7 连号区间数
#include<bits/stdc++.h>
using namespace std;
vector<int > v;
int main(){
ios::sync_with_stdio(false);
int N;
cin>>N;
for(int i=0;i<N;i++){
int t;
cin>>t;
v.push_back(t);
}
int mx,mn;
int ans=0;
for(int i=0;i<N-1;i++){
mx=v[i],mn=v[i];
for(int j=i+1;j<N;j++){
mx=max(mx,v[j]);
mn=min(mn,v[j]);
if(mx-mn==j-i) ans++;
}
}
ans+=N;
cout<<ans<<endl;
return 0;
}
PREV-8 买不到的数目 数论/dp
solution-1 数论 AC
#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<a*b-a-b;
return 0;
}
solution-2 简单dp AC
#include<bits/stdc++.h>
using namespace std;
int dp[100000];
int main(){
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
memset(dp,0,sizeof(dp));
dp[n]=1;
dp[m]=1;
for(int i=max(m,n)+1;i<m*n;i++){
if(dp[i-m]||dp[i-n])
dp[i]=1;
}
for(int i=m*n-1;i>0;i--){
if(!dp[i]){
cout<<i<<endl;
break;
}
}
return 0;
}
PREV-9 大臣的旅费 两次dfs求树的直径 ☆
#include<bits/stdc++.h>
using namespace std;
struct Node{
int to;
int dis;
Node(int a,int b):to(a),dis(b){}
};
int goal,max1=-1; //goal保存终点下标
int vis[10005]; //记录是否访问过因为是无向图
vector<Node> v[10005];
int payfor(int x){
int ans=10*x; ;
for(int i=1;i<=x;i++){
ans+=i;
}
return ans;
}
void dfs(int s,int sum){
vis[s]=1;
if(sum>max1){
max1=sum; goal=s;
}
for(int i=0;i<v[s].size();i++){
Node t=v[s][i];
if(!vis[t.to]){
dfs(t.to,sum+t.dis);
}
}
}
int main(){
ios::sync_with_stdio(false);
int n;
cin>>n;
memset(vis,0,sizeof(vis));
for(int i=1;i<n;i++){
int a,b,c;
cin>>a>>b>>c;
v[a].push_back(Node(b,c));
v[b].push_back(Node(a,c));
}
dfs(1,0);
memset(vis,0,sizeof(vis));
dfs(goal,0);
cout<<payfor(max1);
return 0;
}
PREV-10 幸运数
#include<bits/stdc++.h>
using namespace std;
int m,n;
int vis[1000005],a[1000005];
int main(){
ios::sync_with_stdio(false);
cin>>m>>n;
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
int tmp,cnt,ans=0;
while(!ans){
tmp=0,cnt=0;
bool t=false;
for(int i=2;i<=n;i++){
if(!a[i]&&!vis[i]){
tmp=i;
vis[i]=1;
t=true;
break;
}
t=false;
}
if(t==false) break;
for(int i=1;i<=n;i++){
if(!a[i]) cnt++;
if(cnt==tmp){
a[i]=1;
cnt=0;
}
}
}
for(int i=m+1;i<n;i++){
if(!a[i]) ans++;
}
cout<<ans;
return 0;
}
PREV-11 横向打印二叉树
No Solution
PREV-12 危险系数 bfs☆
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
int e[2000][2],vis[2000];
vector<int> v[1001];
void creat(){
int j;
int from,to;
for(j=0;j<m;j++){
cin>>from>>to;
e[j][0]=from,e[j][1]=to;
v[from].push_back(to);
v[to].push_back(from);
}
}
void check(int a,int from,int to){
int ok=0;
queue<int> q;
vis[from]=1;
q.push(from);
while(!q.empty()){
int t=q.front();
q.pop();
for(int i=0;i<v[t].size();i++){
if(v[t][i]==a) continue;
if(vis[v[t][i]]==0)
if(v[t][i]!=to) {q.push(v[t][i]);vis[v[t][i]]=1;}
else {ok=1;break;}
}
if(ok==1)
break;
}
if(ok==0) ans++;
}
int main(){
int from,to;
cin>>n>>m;
creat();
cin>>from>>to;
check(0,from,to);
if(ans) {cout<<-1;return 0; }
for(int i=1;i<n;i++){
if(i==from||i==to) continue;
memset(vis,0,sizeof(vis));
check(i,from,to);
}
cout<<ans;
return 0;
}
PREV-13 网络寻路 dfs☆
#include<bits/stdc++.h>
using namespace std;
vector<int>g[10003];
int book[10003];
int n,m,ans,root;
void dfs(int x,int cnt){
if(cnt==4){ans++;return;}
for(int i=0;i<g[x].size();i++){
if(!book[g[x][i]]){
book[g[x][i]]=1;
dfs(g[x][i],cnt+1);
book[g[x][i]]=0;
}
else if(cnt==3&&g[x][i]==root){
dfs(g[x][i],cnt+1);
}
}
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=0;i<m;i++){
int x,y;cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
for(int i=1;i<=n;i++){
memset(book,0,sizeof(book));
book[i]=1;
dfs(root=i,1);
}
cout<<ans;
return 0;
}