2023码蹄杯全国职业院校程序设计竞赛省赛(一)题解

A 银河间的数字之战

题目大意 : 输入 A 、B 输出 A + B

#include <bits/stdc++.h>

using namespace std;

int main()
{
	int a , b ;
	scanf("%d %d",&a,&b);
	printf("%d",a+b);
	return 0 ; 
}

 B 特殊数字

题目大意 : 给定一个区间 [n , N] 计算区间内满足能同时被 2 和 3 整除的数之和

N∈[1,1e5] ,  ans∈[1,1e5(1+1e5)/2] , ansMax < 1e9 因此 答案是属于 int 范围内的

#include <bits/stdc++.h>

using namespace std;

int main()
{
	int n , N , ans = 0 ; 
	scanf("%d,%d",&n,&N) ;
	while ( n <= N ) 
	{
		if ( n % 2 == 0 && n % 3 == 0 ) ans += n ;
		n ++ ;
	}
	printf("%d",ans);
	return 0 ; 
}

C 小码哥的艰难选择

题目大意 : 总共有n个回合,每个回合某个花有分数变化问最低的是什么,如果有相同值输出第一个出现的

#include <bits/stdc++.h>

using namespace std;

int main()
{
	unordered_map<string,int> mp; 
	int n ;
	cin >> n ;
	string loser = "ZXR" ;
	mp[loser] = 1000 ;
	while ( n-- )
	{
		string str ;
		int sorce , minn = 1000 ;
		cin >> str >> sorce ;
		mp[str] += sorce ;
		for(auto s : mp) 
		{
			if (s.second < minn)
			{
				minn = s.second ;
				if ( minn < mp[loser] ) loser = s.first ; 
			}
		}
	}
	cout << loser << '\n' << mp[loser] + 1000 ;
	return 0 ; 
}

 D 世界警察大战

滑动窗口模板题

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 10 ;
int a[N] , n , ans ;

int main()
{
	scanf("%d",&n) ;
	for(int i = 0 ; i <= n ; i++ ) scanf("%d",&a[i]) ;
	unordered_map<int,int> mp;
	int left = 0 , right = 0;
	while ( right < n ) 
	{
		mp[a[right]] ++ ;
		while (left < right && mp[a[right]] > 1)
		{
			mp[a[left++]]--;
		}
		ans = max(right - left + 1, ans);
		right ++ ;
	}
	printf("%d",ans);
	return 0 ; 
}

E 找鸭子

题目大意 : 给一个字符串输出字符串最大的字符

void solve()
{
    string s ;
    cin >> s;
    cout << char( *max_element(s.begin(),s.end()) ) ;
}

F 小码哥的英语

俩种合法方案 : ABAB…… / BABA…… 

#include <bits/stdc++.h>

using namespace std ;

char change(char ch) { return char('A' + 'B' - ch ) ;}

int solve(string str)
{
	int a = 0, b =0 ;
	char ch = 'A' ;
	for(auto s : str)
	{
		if (s != ch) a++;
		else if (s != change(ch)) b++;
		ch = change(ch) ;
	}
	return min(a,b);
}

int main()
{
	int n ;
	scanf("%d",&n);
	while (n--)
	{
		string str ;
		cin >> str ;
		printf("%d\n",solve(str));
	}
	return 0 ; 
}

G 中转站

dfs跑一遍

#include<bits/stdc++.h> 

using namespace std;
// 手写链表版
const int inf = 0x3f3f3f3f , N = 510 , M = 1e5 + 10;    

int h[N] , e[M] , ne[M] , idx  , n , m ;
bitset<N>st;

void add(int a,int b) { e[idx] = b , ne[idx] = h[a] , h[a] = idx++ ; }

bool dfs(int x)
{
    if ( x == n ) return true ;
    for(int i = h[x] ; i != -1 ; i = ne[i] ) 
    {
        int j = e[i] ;
        if ( !st[j] ) 
        {
            st[j] = true ;
            if ( dfs(j) ) return true  ;
        }
    }
    return false ;
}
void solve()
{
    memset(h,-1,sizeof h) ;
    scanf("%d%d",&n,&m) ;
    while ( m-- )
    {
        int u , v;
        scanf("%d%d",&u,&v);
        add(u,v) ;
    }
    if ( dfs(1) ) puts("Yes") ;
    else puts("No");
}

int main()
{
    solve();
    return 0 ;
}

H 神器宝盒

题目大意 : 如果输入的不是10的倍数则翻倍输出否则输出0

void solve()
{
    int n ;
    scanf("%d",&n) ;
    if ( n % 10 == 0 ) printf("0") ;
    else printf("%d",n*2) ;
}

I 神秘门的密码

题目大意 : 如果输入的字符串长度为奇数则输出123456否则输出前一半字符串和后一半字符串反转后二者拼接得到的字符串

void solve()
{
    string s ;
    cin >> s;
    if ( s.size() & 1 ) 
    {
        cout << "123456" ;
    }
    else
    {
        string l = s.substr(0,s.size()/2) , r = s.substr(s.size()/2) ;
        reverse(r.begin(),r.end());
        cout << l + r ; 
    }
}

J 安全验证

题目大意 : 给一个字符串判断能不能找个真字串满足是前后缀且也出现在中间

调用string::find  、 algorithm库 search函数 、手写一个朴素匹配 均可通过

再者哈希二分、KMP、exKMP也可 

#include <bits/stdc++.h>

using namespace std ;

bool Find(string a,string b) // 朴素匹配
{
    for(int i = 0 ; i < a.size() - b.size() + 1; i++ )
    {
        for(int j = i , p = 0  ; p < b.size() ; j++ , p++ )
        {
            if (a[j] != b[p]) break ;
            if (p == b.size() - 1) return true ;
        }
    }
    return false ;
}

int main()
{
    string str ;
    cin >> str ;
    string S = str.substr(1,str.size()-2) , s = "";

    for(int i = 0 ; i < str.size() / 2 ; i++ ) 
    {
        bool flag = true ;
        s += str[i] ;
        for(int j = str.size() - i - 1 , k = 0 ; j < str.size() ; j ++ , k++ )
        {
            if ( str[j] != str[k] ) 
            {
                flag = false ;
                break ;
            }
        }
        if ( flag && search(S.begin(),S.end(),s.begin(),s.end()) != S.end() )
        {
            cout << s ;
            return 0 ;
        }
    }
    puts("No");
    return 0 ;
}

K 科学计数法

题目大意 : 将数表示成 a * $10^b$ 简写成 aEb

#include<bits/stdc++.h> 

using namespace std;

void solve()
{
	string s ;
	cin >> s ;
	if ( s.find(".") != s.npos ) 
	{
		int len = s.find(".") , num = 0 ;
		string m = s.substr(len+1) ;
		while ( m.size() && m.back() == '0' ) m.pop_back() ; //去除尾 0
		for(auto v : m) num = num * 10 + v - '0' ;
		if ( num != 0 )
		{
			if ( len == 1 ) 
			{
				cout << s ;
			}
			else
			{
				cout << s[0] << '.' << s.substr(1,len-1) + m << 'E' << len - 1 ;
			}
			return ; 
		}
		else
		{
			s = s.substr(0,len) ;
		}
	}
	//整数情况
	int num = 0 , len = s.size() ;
	string ss = s.substr(1) ;
	while ( ss.size() && ss.back() == '0' ) ss.pop_back() ; //去除尾 0
	for(auto v : ss) num = num * 10 + v - '0' ;

	if ( len == 1 ) 
	{
		cout << s ;
	}
	else if ( num == 0 ) 
	{
		cout << s[0] << 'E' << len-1 ;
	}
	else
	{
		cout << s[0] << '.' << ss << 'E' << len-1 ;
	}
}

int main( )
{
    solve();
    return 0;
}

 L 旅行

 统计每个结点入度即可,保证联通性 。

* 链

* 环

#include <bits/stdc++.h>

using namespace std ;

const int N = 1e5 + 10 , M = 1e5 + 10;

int f[N] , n , m , indegree[N] ;

int find(int x) { return f[x] == x ? x : f[x] = find(f[x]) ;}

void merge(int a,int b) { f[find(a)] = find(b) ;}

int main()
{
	int t;
	scanf("%d",&t);
	while ( t-- )
	{
		scanf("%d %d",&n , &m) ;
		memset(indegree,0,sizeof indegree); 
		for(int i = 1 ; i <= n ; i++ ) f[i] = i ;
		while ( m-- )
		{
			int u , v ;
			scanf("%d %d",&u,&v) ;
			merge(u,v) ;
			indegree[v] ++;
		}
		int count0 = 0, count1 = 0;
		bool flag = true ;
		for(int i = 1 ; i <= n ; i++ ) 
		{
			if ( indegree[i] == 0 ) count0 ++ ;
			else if ( indegree[i] == 1) count1 ++ ;
			if ( find(1) != find(i) ) flag = false ;
		}
		if ( flag && (count1 == n-1 && count0 == 1) ) puts("YES");
		else puts("NO");
	}
	return 0 ;
}

 M 小码哥搭建花圃

题目大意 : 给5个整数 判断能不能构成 正方形或矩形

#include<bits/stdc++.h> 

using namespace std;
const int inf = 0x3f3f3f3f;
void solve()
{
    map<int,int>mp;
    int x ;
    for(int i = 1 ; i <= 5 ; i++ ) 
    {
        cin >> x ;
        ++mp[x] ;
    }
    if ( mp.size() > 3 ) puts("No") ;
    else
    {
        int maxn =0 , sum = 0 ;
        for(auto v : mp ) 
        {
            maxn = max ( maxn , v.second );
            if ( v.second == 1 ) sum ++ ;
        }
        if ( maxn >= 4 ) puts("Square");
        else if ( sum <= 1 ) puts("Rectangle") ;
        else puts("No");
    }
}

int main( )
{
    solve();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenRenning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值