2021南宁周赛!第一期题解

前话:全是签到题!(除了最后一题

本题解秉承遇事不决放标程代码的良好作风,旨在让各位了解题目的简单性与我们的善良。
补题入口

更新:
H 数据背锅了,最后一个数据出现了重复边,并且当时出题人没考虑到重边问题没加min取最小值,而造数据的手贱暴力造了一组大数据,然后就出了大问题。对于Floyd的问题我再次表示郑重道歉。

A 题数据弱了,出题人数据刚好没有造出来一组卡算法的数据,因此对于 o ( n ) o(n) on算法的选手应该都是错的。

C 题验题人把关不够严,大家看到背包问题就直接读数据了,没有注意到题面描述有问题。在此第二次道歉。

B 题原题-传送门hjm想摸鱼

I 题原题传送门小西卷师

A题原题hjm的卡牌游戏


A: hjm 的卡牌游戏

本题算是思维题+观察数据,普通的寻找卡牌最大值肯定不行,或许可以用线段树或者优先队列过。标程给出的是暴力枚举最大值。

因为数据关系,因此最大值有且只有六十种可能,那么对于每种可能我们都进行一次数组清算。根据尺取原则,定义贡献值为从上一个位置到当前位置一共增加的积分,若积分为负,则为负贡献,那就舍去。记录下所有正贡献情况。

时间复杂度就成了 o ( 30 ∗ n ) o(30*n) o30n

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;

int n, a[N], ans;

int main() {
   
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) {
   
        cin >> a[i];
    }
    for (int mx = 0; mx <= 30; mx++) {
   
        int sum = 0;
        for (int rt = 1; rt <= n; rt++) {
   
            sum += a[rt];
            if (a[rt] > mx)
                sum = 0;
            if (sum < 0) 
                sum = 0;
            ans = max(ans, sum - mx);
        }
    }
    cout << ans << endl;
    return 0;
}

B:hjm学姐想要摸鱼

数据弱,看起来好像很难,其实就是一个简单的暴力扫图。

这题改编自一道洛谷博弈论,改了一下胜负条件,就变成了暴力扫图题。

简单来说,我们可以在sort之后观察到所谓的上取走一个堆,或者抓走每一个,其实都是在走一张图。一个特殊
因此我把数据转化成图,根据博弈结果,碰到边界的人赢。从后往前推,如果当遇到博弈下面两条路结果为必胜点,就转化为必败点,不断翻转,一直推到初始点即可。

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

unsigned long long x; 

int n, a[25], b[25], M[25][25];
int main() {
   
	cin>>n;
	for(int i=1; i<=n; i++) {
   
		cin>>a[i];
	}
	sort(a+1, a+1+n, greater<int>());
	
	for(int i=1; i<=n; i++) {
   
		M[a[i]][i]=1;
		int now=a[i];
		while(now!=a[i+1]) {
   
			M[now--][i]=1;
		}
	}

	for(int j=n-1; j>=1; j--) {
   
		for(int i=a[j]-1; i>=1; i--) {
   
			if(M[i+1][j]==1&&M[i][j+1]==1) {
   
				M[i][j]=0;
			}
			else 
				M[i][j]=1;
		}
	}
	if(M[1][1]) cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
}

C: jmr的仁慈

板子题:二维多重背包,不会的自己面壁,好好反思DP为什么背包题都签不了。

#include<iostream>
#include<random>
using namespace std;
int x[5000][5];
int dp[5000][5000
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值