上海大学第21届ACM程序设计联赛(春季赛)部分题解

本文详细解析了ACM比赛中四个题目:使用二分查找算法的简单问题,通过递推解决棋盘扩散问题,矩阵和检查器函数,以及简化版UNO游戏的实现策略。作者分享了解题过程和代码,展示了对编译原理基础的理解应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

出于某些原因,模拟了一下2023年上海大学ACM校赛练练手,随便写了几个题,整理一下自己的题解。
题目地址

A.Antiamuny wants to learn binary search

傻呗签到题,略。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int f(int l,int r,int x) {
   
    // l <= x <= r
	int cnt = 0;
	while(l <= r) {
   
   
		cnt++;
		int mid = (l + r) / 2;
		if (mid == x) 
			break;
		if (mid < x) 
			l = mid + 1;
		else 
			r = mid - 1;
	}
	return cnt;
}

int main(){
   
   
	int t;
	cin >> t;
	while(t--){
   
   
		int l,r,x;
		cin >> l >> r >> x;
		cout << f(l,r,x) << endl;
	}
} 

B.Bespread with chequers

稍加观察可以得到,对于 2 × n 2×n 2×n的情况下,可以由 2 × ( n − 1 ) 2×(n-1) 2×(n1)的基础上拼一个 2 × 1 2×1 2×1的块,或者在 2 × ( n − 2 ) 2×(n-2) 2×(n2)的基础上拼一个 2 × 2 2×2 2×2或两个 2 × 1 2×1 2×1的块,即 a n = a n − 1 + 2 a n − 2 a_{n}=a_{n-1}+2a_{n-2} an=an1+2an2
由于题目数据范围在 1 e 6 1e6 1e6内,但考虑到有 1 e 3 1e3 1e3组数据,考虑打表,时间复杂度 O ( n ) O(n) O(n)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=1e6;
const ll mod=1e9+7;
int a[maxn+10];
int main(){
   
   
    int t;
    cin >> t;
    a[1]=1,a[2]=3;
    for(int i=3;i<=maxn;i++){
   
   
        a[i]=(2*a[i-2]%mod+a[i-1])%mod;
    }
    while(t--){
   
   
        int n;
        cin >> n;
        cout << a[n] << endl;
    }
}

G.Golden jade matrix checker

按照定义就是,给定一个 n × m n \times m n×

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值