2021辽宁省大学生程序设计竞赛(C、D、E、F、G、L)

本文介绍了几道编程竞赛中的典型题目,涉及传染病统计、网格路径优化、组合数学、字符串操作及数值类型判断等。通过实例解析了如何运用数据结构和算法解决这些问题,包括贪心策略、组合计算、字符串转换和数值范围判断等技巧。这些题目和解决方案展示了编程竞赛中常见问题的解决思路和方法。
摘要由CSDN通过智能技术生成

C-传染病统计

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例

3
2
3 6
3
1 3 5
5
1 2 5 6 7

输出描述

1 1
3 3
2 3

数据范围极小的普通签到题,通过距离是否大于 2 分为多个连通块(?),并统计每个连通块中的人数并更新答案即可。

参考代码

#include <bits/stdc++.h>
using namespace std;
 
int a[10],d[10];
int main(){
    int t,n;
    cin >> t;
    while(t--){
        cin>>n;
        cin>>a[0];
        
        for(int i=1;i<n;i++){
            cin>>a[i];
            d[i-1]=a[i]-a[i-1];
        }
        
        int resMax=-1,resMin=8,cnt=0;
        for(int i=0;i<n-1;i++){
            cnt=0;
            while(d[i]<=2&&i<n-1){
                cnt++;
                i++;
            }
            resMax=max(resMax,cnt);
            resMin=min(resMin,cnt);
        }
        cout<<resMin+1<<' '<<resMax+1<<endl;
    }
 
 
    return 0;
}

D-阿强与网格

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例

3
5 6 2 5
4 7 5 6
7 8 6 5

输出样例

18
33
36

贪心,每进行一次对角线方向的走法其实等价于两次直线方向走法,比较两种方法的价格,同时需要特判网格的特殊形状。

本题卡快读(可恶),考虑由 scanf 读入。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

signed main(){
	int t;scanf("%d",&t);
	ll n,m,x,y;ll ans;
	while(t--){
		scanf("%lld%lld%lld%lld",&n,&m,&x,&y);
		if(m>n)swap(n,m);
		
		if(m==1){
			ans=(n-1ll)*x;
		}else if(2ll*x<=y){
			ans=(n+m-2ll)*x;
		}else if(x<=y){
			ans=(n-m)*x+(m-1ll)*y;
		}else if((n-m)&1){
			ans=(n-2ll)*y+x;
		}else{
			ans=(n-1ll)*y;
		}
		printf("%lld\n",ans);
	}
	return 0;
}

E-生活大爆炸

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例

5 2 5

输出样例

10

数学组合问题,毕竟高中都学过手模一下就好了嘛 ,注意处理相同方案多次计算的问题。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std; 
ll C[65][65];

int main(){
    int n,m,t;
    for(int i = 0;i <= 65;i++)
        for(int j = 0;j <= i;j++){
            if(!j)
                C[i][j] = 1;
            else
                C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
        }
    cin >> n >> m >> t;
    ll ans = 0;
    for(int i = 4;i <= n;i++)
        for(int j = 1;j <=m;j++)
            if(i + j == t)
                ans += C[n][i] * C[m][j];
    cout << ans << endl;
 
    return 0;
}

F-Capslock

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例1

cAPS

输出样例1

Caps

输入样例2

Lap

输出样例2

Lap

对各种情况模拟即可,注意 asc 码中大写字母在小写字母之前。

参考代码

#include <bits/stdc++.h>
using namespace std;

int main(){
    int flag=0;
    string s;
    cin>>s;
    for(int i=1;i<s.size();i++)
        if(s[i]>'Z')
            flag=1;
    if(flag==0){
        if(s[0]>'Z')
            s[0]-='a'-'A';
        else s[0]+='a'-'A';
        for(int i=1;i<s.size();i++)
            s[i]+='a'-'A';
        cout<<s<<endl;
    }
    else
        cout<<s<<endl;
    return 0;
}

G-字节类型

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例1

127

输出样例1

byte

输入样例2

123456789101112131415161718192021222324

输出样例2

BigInteger

由于都是正整数,因此比较大小即可。考虑用 __int128 进行转换,在 __int128 范围内且大于 long long 范围的则输出 BigInteger,否则逐级比较。

为了避免麻烦,长度大于 20 的直接输出即可。

参考代码

#include<bits/stdc++.h>
using namespace std;
string a;
__int128 x=0;
int main()
{
	cin>>a;
	int len=a.size();
	if(len>=20){
		printf("BigInteger\n");
		return 0;
	}
	for(int i=0;i<len;i++){
		x=x*10+a[i]-'0';
	}
	if(x>9223372036854775807)printf("BigInteger\n");
	else if(x>147483647)printf("long\n");
	else if(x>32767)printf("int\n");
	else if(x>127)printf("short\n");
	else printf("byte\n");
	return 0;
}

L-神奇的回答

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例

4
19
14
4
122

输出样例

18
14
4
18

不会吧?这题都要讲吗?

人人都会的代码

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n;
    cin>>n;
    while(n--){
        int x;
        cin>>x;
        if(x>=18)
            cout<<18<<endl;
        else
            cout<<x<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值