桂电信科 2020 程序设计大赛 题解

A
相当于hello world,就是多了一个a控制一下个数

//A
#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	int t;
	cin>>t;
	while(t--){
    
    
		int a;
		cin>>a;
		for(int i=0;i<a-1;i++){
    
    
			cout<<"AC "; 
		}
		cout<<"AC"<<endl;
	}
	return 0;
}

B
排序
这数据量冒泡排序也能过

//B
#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	int a[20005];
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
	}
	sort(a,a+n);
	for(int i=0;i<n;i++){
    
    
		cout<<a[i]<<" ";
	}
	return 0;
}

C
回文数,因为只有四位,用四个变量存该四位数的个、十、百、千位即可,然后遍历一遍1001~9999

//C
#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	int a,b,c,d;
	for(int i=1001;i<=9999;i++){
    
    
		a=i%10;//个位 
		b=(i%100)/10;//十位 
		c=(i%1000)/100;//百位
		d=(i%10000)/1000;//千位 
		if(a==d&&b==c) cout<<i<<endl;
	}
	return 0;
}

D
01字串,输出128以内的二进制,可以直接开数组写二进制模拟,逢二进一。我就直接写了一个十转二的函数,偷懒了。

//D
#include<bits/stdc++.h>
using namespace std;
void stob(int num){
    
    
	int n=num;
	int k=0;
	int a[7];
	while(num>1){
    
    
		a[k++]=num%2;
		num/=2;
	}
	a[k]=num;
	for(int i=6;i>k;i--){
    
    
		cout<<0;
	}
	for(int i=k;i>=0;i--){
    
    
		cout<<a[i];
	}
	cout<<endl;
}
int main(){
    
    
	for(int i=0;i<=127;i++){
    
    
		stob(i);
	}
	return 0;
}

E
小写转大写
第一个字母直接转,后面的看空格,空格后的第一个字母转大写。
输入要用getline(),一行字符串输入,可以包含空格。
然后正常写一直有点小错,就把输入放进while()里去了,这种oj判定能过,编译器就卡了

//E
#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	int t;
	cin>>t;
	string s;
	while(getline(cin,s)){
    
    
		s[0]-=32;
		for(int i=1;i<s.size();i++){
    
    
			if(s[i]==' ') s[i+1]-=32;
		}
		cout<<s<<endl;
	}
	return 0;
}

F
思维题

#include<bits/stdc++.h>
using namespace std;
int a[21][21];
int main(){
    
    
	int t;
	cin>>t;
	while(t--){
    
    
		int n,k;
		cin>>n;
		memset(a,0,sizeof(a));
		vector<int> ve;
		for(int i=1;i<=n;i++){
    
    
			for(int j=1;j<=n;j++){
    
    
				cin>>k;
				if(k==1&&a[j][i]==0&&i!=j) a[i][j]=1;
				if(k==1&&a[j][i]==1&&i!=j) ve.push_back(i),ve.push_back(j);
			}
		}
		sort(ve.begin(),ve.end());
		for(int i=0;i<ve.size();i++){
    
    
			cout<<ve[i]<<" ";
		}
		cout<<endl;
	}
}

G
这是蓝桥杯里摘的题
思路一下就能看出来用递归,耐心点把An和Sn找到,就出来了。

//G
#include<bits/stdc++.h>
using namespace std;
void An(int n){
    
    
    for(int i=1;i<=n;i++){
    
    
        cout<<"sin("<<i;
        if(i%2!=0&&i!=n){
    
    
            cout<<"-";
        }
        if(i%2==0&&i!=n){
    
    
            cout<<"+";
        }
    }
    for(int i=0;i<n;i++){
    
    
        cout<<")";
    }
}
void Sn(int n){
    
    
    int d=n;
    for(int i=0;i<n-1;i++){
    
    
        cout<<"(";
    }
    for(int i=1;i<=n;i++){
    
    
        An(i);
        cout<<"+"<<d;
        if(d!=1) cout<<")";
        d--;
    }
}
int main(){
    
    
	int t;
	cin>>t;
	while(t--){
    
    
		int n;
		cin>>n;
		Sn(n);
		cout<<endl;
	}
	return 0;
}

H
这题说是最短路,边权有负,没有负环,数据范围也不大,用floyd就出了,可是测试样例一直没过,可能是自己对算法还没有足够理解。

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define M 1305
int maps[M][M];
int n,m;
int u,v,l;
void floyd(){
    
    
	for(int k=1;k<=n;k++){
    
    
		for(int i=1;i<=n;i++){
    
    
			for(int j=1;j<=n;j++){
    
    
				if(maps[i][j]>maps[i][k]+maps[k][j]){
    
    
					maps[i][j]=maps[i][k]+maps[k][j];
				}
			}
		}
	}
}
int main(){
    
    
    int t;
    cin>>t;
    while(t--){
    
    
        cin>>n>>m;
        for(int i=1;i<=n;i++){
    
    
        	for(int j=1;j<=n;j++){
    
    
        		maps[i][j]=INF;
			}
			maps[i][i]=0;
		}
        for(int i=0;i<m;i++){
    
    
        	cin>>u>>v>>l;
        	maps[u][v]=maps[v][u]=l;
		}
        floyd();
        for(int i=2;i<=n;i++){
    
    
        	cout<<maps[1][i]<<endl;
		}
    }
    return 0;
}

H*
出题人打错符号了,还是一个H,就叫它H*吧。
蓝桥杯小题——完美的代价。

//Hh 回文
#include<bits/stdc++.h>
using namespace std;
void solve(){
    
    
    string s;
    int n,j,cnt=0,flag=0,index;
    cin>>n>>s;
    int last=n-1;
    for(int i=0;i<last;i++){
    
    
        for(j=last;j>i;j--){
    
    
            if(s[i]==s[j]){
    
    
                for(int u=j;u<last;u++) s[u]=s[u+1];
                s[last]=s[i];
                cnt+=last-j;
                last--;
                break;
            }
        }
        if(j==i&&(n%2==0||flag==1)){
    
    
            cout<<"Impossible"<<endl;
            return;
        }else if(j==i){
    
    
            flag=1;
            index=i;
        }
    }
    if(!flag) cout<<cnt<<endl;
    else cout<<cnt+n/2-index<<endl;
}
int main(){
    
    
	int t;
	cin>>t;
	while(t--){
    
    
		solve();
	}
	return 0;
} 

I
本场出了A最简单的题目,就第一行一个数,第二行两个数,第三行三个数…
自己定两个变量,一个控制行数,一个一直++。

//I
#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	int t;
	cin>>t;
	while(t--){
    
    
		int m;
		cin>>m;
		int k=1;
		int p=1;
		for(int i=1;i<=m;i++){
    
    
			for(int j=1;j<=p;j++){
    
    
				cout<<k++;
			}
			p++;
			cout<<endl;
		}
	}
	return 0;
}

J
找到区间直接排序取最大。
开了两个数组,一个初始,一个过渡。

//J
#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	int t;
	cin>>t;
	while(t--){
    
    
		int n;
		int a[1005];
		memset(a,0,sizeof(a));
		cin>>n;
		for(int i=1;i<=n;i++){
    
    
			cin>>a[i];
		}
		int m;
		int b[1005];
		memset(b,0,sizeof(b));
		cin>>m;
		while(m--){
    
    
			int l,r,K;
			cin>>l>>r>>K;
			for(int i=0,j=l;j<=r;j++,i++){
    
    
				b[i]=a[j];
			}
			sort(b,b+r-l+1);
			cout<<b[r-l-K+1]<<endl;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/iuk11/article/details/108735433