前话:全是签到题!(除了最后一题
本题解秉承遇事不决放标程代码的良好作风,旨在让各位了解题目的简单性与我们的善良。
补题入口
更新:
H 数据背锅了,最后一个数据出现了重复边,并且当时出题人没考虑到重边问题没加min取最小值,而造数据的手贱暴力造了一组大数据,然后就出了大问题。对于Floyd的问题我再次表示郑重道歉。
A 题数据弱了,出题人数据刚好没有造出来一组卡算法的数据,因此对于 o ( n ) o(n) o(n)算法的选手应该都是错的。
C 题验题人把关不够严,大家看到背包问题就直接读数据了,没有注意到题面描述有问题。在此第二次道歉。
B 题原题-传送门hjm想摸鱼
I 题原题传送门小西卷师
A题原题hjm的卡牌游戏
A: hjm 的卡牌游戏
本题算是思维题+观察数据,普通的寻找卡牌最大值肯定不行,或许可以用线段树或者优先队列过。标程给出的是暴力枚举最大值。
因为数据关系,因此最大值有且只有六十种可能,那么对于每种可能我们都进行一次数组清算。根据尺取原则,定义贡献值为从上一个位置到当前位置一共增加的积分,若积分为负,则为负贡献,那就舍去。记录下所有正贡献情况。
时间复杂度就成了 o ( 30 ∗ n ) o(30*n) o(30∗n)。
#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