第十五届计算机应用大赛程序设计竞赛(个人)

先晒排名 alt 难度评价仅表示在该比赛中的相对难度

A 二进制?十进制!(简单)

二进制、模拟 使用移位运算和按位与拆解成0、1,再拼接成十进制

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define l first
#define r second 
int solve(){
	int a,b;cin>>a>>b;
    int aa=0,bb=0;
    stack<int> sa,sb;
    while(a){
        if(a&1){
            sa.push(1);
        }
        else{
            sa.push(0);
        }
        a>>=1;
    }
     while(b){
        if(b&1){
            sb.push(1);
        }
        else{
            sb.push(0);
        }
         b>>=1;
    }
    while(!sa.empty()){
        aa*=10;
        aa+=sa.top();
        sa.pop();
    }
    while(!sb.empty()){
        bb*=10;
        bb+=sb.top();
        sb.pop();
    }
    cout<<aa+bb<<endl;
	return 0;
}
signed main(){
	int t=1;
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

B 矩阵元素定位(签到题)

二位数组 没啥好讲的了,语法题

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define l first
#define r second 
int solve(){
	int n,m;cin>>n>>m;
    vector<vector<int>> a(n+2,vector<int>(m+2,0));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    int x,y;cin>>x>>y;
    cout<<a[x][y]<<endl;
	return 0;
}
signed main(){
	int t=1;
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

C 奇妙的字符串(简单)

字符串、(STL) 对字符串的处理

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define l first
#define r second 
int solve(){
	string s,t;
    while(cin>>s){
        cin>>t;
        //cout<<s<<" "<<t<<endl;
        string ans="";
        for(char c:s){//增强for遍历
            ans=c+ans;
        }
        string ans1="";
        for(char c:t){
            ans1=c+ans1;
        }
        //ans+=t;
        cout<<ans<<ans1<<endl;
    }
	return 0;
}
signed main(){
	int t=1;
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

D 张老师组队(偏难)

我的map的key是能力值,value是个数 res计算出组合成t需要的另一个同学的能力值 判断是否存在 如果需要的能力值相同,假设该能力值有x个,则会有x-1+...+2+1个组合情况数,即x*(x-1)/2 如果能力值不同,则两个数相乘就是情况数。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define l first
#define r second 
int solve(){
	int n,t;cin>>n>>t;
    vector<int> a(n+2,0);
    map<int,int> mp;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        mp[a[i]]++;
    }
    int ans=0;
    vector<bool> b(n+2,false);
    for(auto& [i,j]:mp){
        int res=t-i;
        if(mp.count(res)){
            if(res==i){
                ans+=j*(j-1)>>1;
                j=0;
            }
            else{
                ans+=mp[res]*j;
                mp[res]=0;
                j=0;
            }
        }
    }
    cout<<ans<<endl;
	return 0;
}
signed main(){
	int t=1;
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

E 递归实现排列型枚举(偏难) dfs 我用的不是dfs写的,所以这个代码是冯智桀的 我帮他加点注释

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
void dfs(int len,vector<int>& visited,string& s){
  //dfs先写中止条件,避免段错误
    if(len>=n){
      //打印答案
        for(int i=0;i<n;i++){
            cout<<s[i]<<' ';
        }
        cout<<endl;
    }
  //枚举每一个没用使用的数
    for(int i=1;i<=n;i++){
        if(visited[i]==0){
          //标记为使用了
            visited[i]=1;
          //拼接答案
            s += to_string(i);
            dfs(len+1,visited,s);
          //递归的归
          //重置
            visited[i]=0;
            s=s.substr(0,s.size()-1);
        }
    }
    return ;
}

signed main(){
    cin>>n;
    vector<int> a(n,0);
    vector<int> visited(n+1,0);
    for(int i=0;i<n;i++){
        cin>>a[i];

    }
    string result;
        
    for(int i=1;i<=n;i++){
        visited[i]=1;
        result += to_string(i);
        dfs(1,visited,result);
        visited[i]=0;
        result=result.substr(0,result.size()-1);
    }
    
    return 0;
    
} 

以下是我使用的内置的全排列函数

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define l first
#define r second 
int solve(){
	int n;cin>>n;
    vector<int> a(n+2,0);
    for(int i=1;i<=n;i++){
        a[i]=i;
    }
    do{
        for(int i=1;i<=n;i++){
            cout<<a[i]<<' ';
        }cout<<endl;
    }while(next_permutation(a.begin()+1,a.end()-1));
	return 0;
}
signed main(){
	int t=1;
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

F 两数之和(签到题)

思维 大于2的数-1都不等于1

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define l first
#define r second 
int solve(){
	int z;cin>>z;
    if(z<=2){
        cout<<"NO"<<endl;
    }
    else{
        cout<<"YES"<<endl;
        cout<<1<<" "<<z-1<<endl;
    }
	return 0;
}
signed main(){
	int t=1;
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

G 很二的拆分(中等)

数学、二进制性质 对于一个二进制数,第i位等于1,其余位为0,则这个数等于2的i-1次幂 0不属于正整数,则奇数都为-1 偶数拆分二进制位,输出答案

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define l first
#define r second 
int solve(){
	int n;cin>>n;
    if(n&1){
        cout<<-1<<endl;
    }
    else{
        stack<int> ans;
        int res=1;
        while(n){
            if(n&1){
                ans.push(res);
            }
            n>>=1;
            res<<=1;
        }
        while(!ans.empty()){
            cout<<ans.top()<<" ";
            ans.pop();
        }cout<<endl;
    }
	return 0;
}
signed main(){
	int t=1;
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}