NOIP2025模拟赛21总结
2025-08-14 17:57:59
发布于:陕西
T1 | T2 | T3 | T4 |
---|---|---|---|
参赛网址:https://oj.33dai.cn/d/TYOI/contest/6899b750c5d9c2f14c1fd4cb
T1 小明与魔法【NOIP2025模拟赛T1】
题目难度:
算法标签:贪心
思路
特殊性质 :存在 ,使得对任意 ,均有 。
子问题 :当 特殊性质 的约束下,即至少有 行全是 ,所以可以直接用这一行去补全不是全 的列。
然后,在一般情况,我们考虑构造 全 行。
对于任意一行,每一个 都需要 次代价修改为 。如上图。
可能有点难,就是让所有的0都通过转换制度变为1。
所以枚举每一行,然后判断每一行的 的个数,取最小值后转化成了 子问题 。我们就做完了
95 Wrong Answer
#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;
}
吗?
我们发现,当这一行全是 时,答案 。
AC Code
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=3005;
int n,qw,minn=inf;
char ch[maxn][maxn];
bool l[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>>ch[i][j];
for(int j=1;j<=n;j++){
qw++;
for(int i=1;i<=n;i++){
if(ch[i][j]=='0'){
qw--;
break;
}
}
for(int i=1;i<=n;i++){
if(ch[i][j]=='1'){
l[j]=1;
break;
}
}
}
for(int i=1;i<=n;i++){
int cnt=0;
if(!l[i])cnt++;
for(int j=1;j<=n;j++)if(ch[i][j]=='0')cnt++;
minn=min(minn,cnt);
}
cout<<minn+n-qw;
return 0;
}
T2 小明去旅游 6【NOIP2025模拟赛T2】
题目难度:
算法标签:DP,树上DP
思路
算法选择:贪心,DP
很明显,如果是贪心,正常的 出题人会使 。
所以开始 。
考虑 表示 的子树中选 个连通块并且 不在其子树的任意一个连通块里。
表示 的子树中选 个连通块并且 在其子树的一个连通块里。
然后考虑:
-
开始状态:$\forall i \in [1,n] $ 满足 是叶节点的 $ dp_{i,0,1}=0$
-
答案: 满足 不是叶节点的都可以是根,在开始是给定
AC Code
I have none
全部评论 2
这篇题解太赞了!!!
2025-08-14 来自 陕西
0忘川水依:快点赞!
2025-08-14 来自 陕西
0
有帮助,赞一个