news 2026/4/23 10:50:39

2025NOIP T2

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2025NOIP T2

题目:

感觉没紫题(上位蓝题到下位紫,考虑到考场上难度自动上升半段,给紫题也合理

首先我们考虑什么情况下会出错:

很显然,对于某个数i,如果w=2,按照贪心策略如果选中一定不会出错(在/2的情况下仍然排在前面,说明原价一定比较高)

如果w=1,选中该数可能会导致后续只能选择另一个w=1的数(这个数可能很小)而导致无法选择一个w=2的数(这个数可能大于所选的两个w=1的数的和)

所以我们考虑正难则反

也就是找出所有非法情况

我们令y=本来应该选择的数,x=贪心策略选择的数(大)z=贪心策略选择的数(小)

把a从小到大排序:

最优解为

........y.......

当前选择为

....z...x....(y)(没选)...

显然的,x>a[y]/2,所以它被选择了;

我们尝试将区间分段,考虑每个区间的取数;

Ⅰ:随便取任何数(1/2),因为z是选的最后一个数,所以该段区间的w赋值无影响,为答案提供2^z种可能性

Ⅱ:已知y没有被取,因为在给到w=2时a[y]/2<a[x]/1;那么对于无论/2还是/1都更小的Ⅱ区间内的数更不会被取,他们的性价比无论如何都低于y

Ⅲ:w=2时,他们的性价比一定比y低,不考虑,w=1时,在已经选择x的情况下,选择该数一定是最优解,而我们当前考虑的是错解,所以不考虑;

Ⅳ:w=2时性价比小于y,不选,w=1时选择,cost=0/1

Ⅴ:w=1/2都选,cost=1/2

我们考虑枚举x,y;z的范围可以根据xy的范围得出,因为x,z必选,且w都等于1,所以留给剩下选数的cost=m-2;

观察上面的图,发现了吗,只有Ⅳ,Ⅴ区间内的数才会被选择,其中Ⅴ内的数必被选中,我们可以将cost统一减去Ⅴ范围内数的个数,这样Ⅳ/Ⅴ区间内的数w就都变成了0/1;

对于每一组x,y,我们需要在(n-x-1)个数中选择(cost-(n-y))=(m-2-(n-y))个数,组合数O1搞定,总时间复杂度O2;

os:洛谷卡signed main.......这我是真没想到

code:

#include<bits/stdc++.h>
//#define int long long
#define inf 0x3f3f3f3f3f3f3f
#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define cnot cout<<"NO"<<"\n"
#define cyes cout<<"YES"<<"\n"
#define cans cout<<ans<<"\n"
#define pb push_back
#define x0 first
#define y0 second
#define lc p<<1
#define rc p<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
#define sp(x) fixed<<setprecision(x)
#define all(v) v.begin(),v.end()
#define fr(i,st,ed) for(int i=st;i<=ed;i++)
#define ffr(i,st,ed,dt) for(int i=st;i<=ed;i+=dt)
#define all1(a) a.begin()+1,a.end()
using namespace std;
typedef pair<int,string>Pis;
typedef pair<int,int>Pii;
const int N=10005,mod=998244353,M=1e6+10;
int lowbit(int x){
return x&(-x);}
//vector<int>inv2(N);
int inv2[N];
//vector<vector<int> >C(N,vector<int>(N));
int C[N][N];
int a[N];
void P(){
inv2[0]=1;
for(int i=1;i<10001;i++){
inv2[i]=(long long)2*inv2[i-1]%mod;
}
C[0][0]=1;
for(int i=1;i<10001;i++){
C[i][0]=1;
for(int j=1;j<=i;j++){
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
}
}
void solve(){
int n,m;
cin>>n>>m;
//vector<int>a(n+1);

fr(i,1,n){
cin>>a[i];
}
//sort(all1(a));
sort(a+1,a+1+n);
int ans=0;
for(int x=1;x<=n;x++){
int pos=0;
for(int y=x+1;y<=n;y++){
if(a[x]==a[y]){
continue;
}
if((m-2-(n-y))<0){
continue;
}
if(2*a[x]<=a[y]){
break;
}
while(pos<n&&a[pos+1]+a[x]<a[y]){
pos++;
}
ans=(ans+(long long)1*C[n-x-1][m-2-(n-y)]*inv2[pos])%mod;
}
}
ans=(inv2[n]-ans+mod)%mod;
cans;
}
int main(){
GG;
int _t=1;
int __;
P();
cin>>__>>_t;
while(_t--){
solve();
}

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 8:35:48

Linux常见系统故障案例说明并修复解决(上)

Linux系统故障排查思路实践教程&#xff08;下&#xff09;https://coffeemilk.blog.csdn.net/article/details/155903189 一、恢复Linux下的误删除文件 1.1、故障情况 在Linux系统上执行【rm -rf】误删除了指定分区的全部数据&#xff0c;且被删除的这个分区文件系统类型是【…

作者头像 李华
网站建设 2026/4/23 14:13:16

480万人才缺口下,零基础转行网络安全:是风口还是挑战?

网络安全作为近两年兴起的热门行业&#xff0c;成了很多就业无门但是想转行的人心中比较向往但是又心存疑惑的行业&#xff0c;毕竟网络安全的发展史比较短&#xff0c;而国内目前网安的环境和市场情况还不算为大众所知晓&#xff0c;所以到底零基础转行入门网络安全之后&#…

作者头像 李华
网站建设 2026/4/23 12:47:42

基于SpringBoot的体育馆管理系统(源码+lw+部署文档+讲解等)

课题介绍 本课题聚焦传统体育馆管理流程繁琐、场地预约低效、资源调度混乱的痛点&#xff0c;开展基于SpringBoot的体育馆管理系统的设计与实现工作。系统以Java为核心开发语言&#xff0c;依托SpringBoot框架搭建轻量高效的后端服务架构&#xff0c;负责处理场地预订、器材管理…

作者头像 李华
网站建设 2026/4/23 12:58:03

C++多线程入门

博主介绍&#xff1a;程序喵大人 35 - 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x…

作者头像 李华
网站建设 2026/4/23 11:26:06

28、实用 awk 程序大集合

实用 awk 程序大集合 在日常的数据处理和文本操作中,awk 是一个功能强大且灵活的工具。本文将介绍一系列实用的 awk 程序,涵盖文件分割、输出复制、去重、计数、查找重复单词、闹钟设置以及字符转写等多个方面。 1. 文件分割程序 文件分割程序的主要功能是将一个大文件分割…

作者头像 李华
网站建设 2026/4/23 11:27:14

30、高级编程技巧与 gawk 特性深度解析

高级编程技巧与 gawk 特性深度解析 1. shell 脚本与命令替换 在 shell 编程中,有一种操作是将 shell 脚本到标记处的内容作为输入传递给命令。shell 会对 here 文档的内容进行变量和命令替换(可能还会有其他操作,具体取决于 shell)。 1.1 命令替换 $(…) 这种 shell 结…

作者头像 李华