NOIP2025模拟赛21
T1 | T2 | T3 | T4 |
---|---|---|---|
\({\color{#52C41A} 普及+/提高}\) | \({\color{#3498DB} 提高+/省选− }\) | \({\color{purple} 省选/NOI−}\) | \({\color{black} NOI/NOI+/CTSC }\) |
参赛网址:https://oj.33dai.cn/d/TYOI/contest/6899b750c5d9c2f14c1fd4cb
T2,T3,T4未完成搭建
T1 小明与魔法【NOIP2025模拟赛T1】
题目难度:\({\color{#52C41A} 普及+/提高}\)
算法标签:贪心
思路
特殊性质 \(A\):存在 \(1\le i\le n\),使得对任意 \(1\le j\le n\),均有 \(c_{i,j}=1\)。
子问题 \(\alpha\):当 特殊性质 \(A\) 的约束下,即至少有 \(1\) 行全是 \(1\),所以可以直接用这一行去补全不是全 \(1\) 的列。
然后,在一般情况,我们考虑构造 全 \(1\) 行。
对于任意一行,每一个 \(0\) 都需要 \(1\) 次代价修改为 \(1\)。
所以枚举每一行,然后判断每一行的 \(0\) 的个数,取最小值后转化成了 子问题 \(\alpha\)
\(\color{fb5555} Wrong\) \(\color{fb5555} Answer\) \(\color{fb5555} 95\)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=3005;
const int inf=1e18+7;
int n;
int ans=inf;
int vis[maxn];
char a[maxn][maxn];
signed main(){
freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
cin>>n;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
cin>>a[i][j];
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (a[i][j]=='1') vis[i]=1;
for (int i=1;i<=n;i++){
int f=0;
for (int j=1;j<=n;j++){
if (a[i][j]=='1') continue;
f++;
}
ans=min(ans,f);
}
for (int i=1;i<=n;i++){
int f=0;
for (int j=1;j<=n;j++){
if (a[j][i]=='0') f=1;
}
ans+=f;
}
cout<<ans;
return 0;
}
了吗?
我们发现,当这一行全是 \(0\) 时,答案 \(++\)。
AC Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=3005;
const int inf=1e18+7;
int n;
int ans=inf;
int vis[maxn];
char a[maxn][maxn];
signed main(){
freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
cin>>n;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
cin>>a[i][j];
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (a[i][j]=='1') vis[j]=1;
for (int i=1;i<=n;i++){
int f=0;
for (int j=1;j<=n;j++){
if (a[i][j]=='1') continue;
f++;
}
if (vis[i]==0&&f!=0) f++;
ans=min(ans,f);
}
for (int i=1;i<=n;i++){
int f=0;
for (int j=1;j<=n;j++){
if (a[j][i]=='0') f=1;
}
ans+=f;
}
cout<<ans;
return 0;
}
T2 小明去旅游 6【NOIP2025模拟赛T2】
题目难度:\({\color{#3498DB} 提高+/省选− }\)
算法标签:DP,树上DP
题意
翻译中...
思路
算法选择:贪心,DP
很明显,如果是贪心,正常的 出题人会使 \(1 \le k \le 10^5\)。
所以开始 \(DP\)。
考虑 \(dp_{i,j,0}\) 表示 \(i\) 的子树中选 \(j\) 个连通块并且 \(i\) 不在其子树的任意一个连通块里。
\(dp_{i,j,1}\) 表示 \(i\) 的子树中选 \(j\) 个连通块并且 \(i\) 在其子树的一个连通块里。
然后考虑:
-
开始状态:$\forall i \in [1,n] $ 满足 \(i\) 是叶节点的 $ dp_{i,0,1}=0$
-
答案:\(\forall i \in [1,n]\) 满足 \(i\) 不是叶节点的都可以是根,在开始是给定 \(rt\) \(ans=\min(dp_{rt,k,0},dp_{rt,k-1,1})\)
最后是转移:
给定 $u \in [1,n],j \in [0,k] $
点 \(v\) 是 点 \(u\) 的儿子,点 \(u\) 已经选了 \(j\) 个 连通块,点 \(v\) 已经选了 \(t\) 个连通块。
转移中...
复杂度证明
严格证明:该算法 时间复杂度为 \(O(n\times k)\)
证明中...
AC Code
Waiting...
Judge...
WrongAnswering...
QAQ...
T3 字符串的小明【NOIP2025模拟赛T3】
题目难度:\({\color{purple} 省选/NOI−}\)
T4 进击的小明【NOIP2025模拟赛T4】
题目难度:\({\color{black} NOI/NOI+/CTSC }\)