尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

2026河南萌新联赛第五场(信息工程大学)补题A、B、D、J、K

2026河南萌新联赛第五场(信息工程大学)补题A、B、D、J、K 文章目录D题三维空间解题过程实现代码知识点补充关于tuplemake_tuple 快速构造tuple 直接比较大小tuple和vector 搭配J题map简单字符串遍历解题过程实现代码知识点补充A题十六进制完全背包解题过程实现代码K题筛法解题过程实现代码知识点补充1.埃氏筛筛素数倍数枚举求约数和2.欧拉筛线性筛欧拉筛求约数个数3.区间筛分段筛B 题DFS搜配方解题过程实现代码题号题目难度E ✅冰熊王·欢愉领域very easyD ✅八角玄冰草·万向刺easyH ✅思东拳·思如泉涌easyJ ✅浩东掌·生生世世easyA ✅天梦冰蚕·模拟medium easyK ✅鬼雕神刀·龙雩集舞刀法medium easyB ✅冰碧帝皇蝎·冰帝之螯mediumG邪眼暴君主宰·精神吞噬medium hardL晨露刀·冰雪女神的叹息medium hardC冰天雪女·大寒无雪hardF人鱼公主·二重唱hardI念东剑·念念不忘very hardD题三维空间难度easyD-八角玄冰草·万向刺_河南萌新联赛2026第五场信息工程大学题面要点n × m × l n\times m\times ln×m×l的三维字符网格中有一个H和若干T。H不动每次可向任意连续方向射出一条从H出发的无限射线射穿一切障碍扫过的T全部被击破。同一方向定义为两靶点到H的方向向量成正实数倍反方向不算同一方向。求最少几次技能能击破所有靶。解题过程将不同的斜率存储起来那斜率的种数就是 答案vector中可以是二维数组pair也可以是三维数组(tuple)实现代码#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define PLL pairll, ll #define YES coutYESendl; #define NO coutNOendl; using namespace std; const ll INF1e15; const ll MAXN100005; using namespace std; ll n,m,l; char a[105][105][105]; ll x-1,y-1,z-1; int main() { IOS cinnml; for(ll i1;in;i) { for(ll j1;jm;j) { for(ll k1;kl;k) { cina[i][j][k]; if(a[i][j][k]H) { xi,yj,zk; } } } } maptuplell,ll,ll,llmp; for(ll i1;in;i) { for(ll j1;jm;j) { for(ll k1;kl;k) { if(a[i][j][k]T) { ll xii; ll yjj; ll zkk; ll dx x-xi; ll dy y-yj; ll dz z-zk; if(dx0 dy0 dz0) { continue; } ll g __gcd(llabs(dx),__gcd(llabs(dy),llabs(dz))); mp[{dx/g, dy/g, dz/g}]; } } } } coutmp.size()endl; // coutfixedsetprecision(x) ; return 0; }知识点补充关于tupletuple元组可以把多个不同类型的数据打包成一个整体和pair很像pair 只能存 2 个tuple 可以存任意多个。#includebits/stdc.h using namespace std; int main() { // 创建tupleint, double, string tupleint,double,string t1{10,3.14,hello}; // get下标(变量) 获取元素下标编译期常量从0开始 cout get0(t1) endl; //10 cout get1(t1) endl; //3.14 cout get2(t1) endl; //hello get0(t1)100; coutget0(t1); return 0; }get0里面的数字必须是编译期常数不能填变量不能用变量当下标make_tuple 快速构造auto t2 make_tuple(1,2.5,abc);结构化auto tmake_tuple(11,22,33); auto [x,y,z]t; // x11 y22 z33tuple 直接比较大小按顺序逐个元素比较和 pair 逻辑一模一样tupleint,int t1{2,5}; tupleint,int t2{2,3}; cout (t1t2); //true第二个53可以直接放进sort排序、放进priority_queue优先队列。tuple和vector 搭配// vector存三元组 w,u,v vectortupleint,int,int vec; vec.emplace_back(10,1,2); vec.emplace_back(5,3,4); sort(vec.begin(),vec.end()); //按第一个元素升序再第二个再第三个J题map简单字符串遍历难度easyJ-浩东掌·生生世世_河南萌新联赛2026第五场信息工程大学解题过程这题算是一个简单的字符串遍历 可是我刚开始遍历的时候 不知道怎么回事最后5一直读不进去可能是刚开始没写好条件吧 然后我就一直在改 改了不知道几次后来就直接换成找下标 一组一组的读入其实还可以直接在后面多加一个‘’这样就都对称了找条件就更好找了。实现代码#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define PLL pairll, ll #define YES coutYESendl; #define NO coutNOendl; using namespace std; const ll INF1e15; const ll MAXN100005; using namespace std; string s; mapstring,llmp; int main() { IOS getline(cin,s); ll ns.size(); ll i0; while(in) { ll ji; while(jns[j]!,) { j; } string parts.substr(i,j); ll pospart.find(:); string namepart.substr(0,pos); ll numstoi(part.substr(pos1)); mp[name]num; ij1; } coutmp.size()endl; string ans; ll maxn0; for(auto p:mp) { if(p.semaxn) { maxnp.se; ansp.fi; } } coutansendl; // coutfixedsetprecision(x) ; return 0; }知识点补充字符串转数字​ stois转int​ stoll ( s)转longlong数字转字符to_stringcin.ignore();吃回车A题十六进制完全背包A-天梦冰蚕·冰原魂兽_河南萌新联赛2026第五场信息工程大学难度medium easy题面要点给十六进制串s ss构造更长的十六进制串T TT无前导 0使s ss为T TT的子串且T TT各位 ASCII 之和的十六进制表示等于s ss。解题过程看了很多题解发现都是DP完全背包完全背包定义有若干种物品每种物品可以选无限多次每个物品拥有重量 (w_i)、价值 (v_i)背包总容量为 W。目标总重量不超过背包容量使得总价值最大。对比01 背包每件物品最多选 1 次完全背包每件物品可以选无数次状态定义(dp[j])背包容量为 j 时可以获得的最大价值。转移公式d p [ j ] max ⁡ ( d p [ j ] , d p [ j − w i ] v i ) dp[j]\max(dp[j],\ dp[j-w_i]v_i)dp[j]max(dp[j],dp[j−wi​]vi​)完全背包容量 j从小到大允许重复选取同一物品01 背包容量 j从大到小避免重复选取条件S为T的子串对于T中每个字符的ASCll码值和 S的十六进制T ( A S C i i ) 16 S ( 16 ) T{(ASCii)16}S{(16)}T(ASCii)16S(16)Δ 追加字符的 A S C i i 码值 \Delta追加字符的ASCii码值Δ追加字符的ASCii码值所以也可以是S ( 16 ) Δ T ( A S C i i ) S(16)\DeltaT(ASCii)S(16)ΔT(ASCii)核心物品集合0,1…9,A…F一共 16 种物品物品的重量该字符的 ASCII 十进制数值例如0重量 48A重量 65允许无限拿我想要多少个0就可以拿多少个题目没有限制追加字符数量没有说每个字符最多只能用一次→ 完全背包最关键标志背包容量Δ \DeltaΔ我们要恰好装满这个容量。实现代码#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define PLL pairll, ll #define YES coutYESendl; #define NO coutNOendl; const ll N1.2e6; using namespace std; bool dp[N]; char last[N]; int main() { string s; cins; ll tmp0; for(ll i0;s[i];i) { if(s[i]0s[i]9) { tmptmp*16(s[i]-0); } if(s[i]As[i]F) { tmptmp*16(s[i]-A10); } } for(ll i0;s[i];i) { tmp-s[i]; } dp[0]true; for(ll i1;itmp;i) { for(char j0;j9;j) { if(ijdp[i-j]) { dp[i]true,last[i]j; } } for(char jA;jF;j) { if(ijdp[i-j]) { dp[i]true,last[i]j; } } } for(ll itmp;i;ii-last[i]) { slast[i]; } couts; return 0; }字符十六进制 ASCII十进制 ASCII字符代表的 16 进制数值00x3048010x3149120x3250230x3351340x3452450x3553560x3654670x3755780x3856890x39579A0x416510B0x426611C0x436712D0x446813E0x456914F0x467015K题筛法难度medium easyK-鬼雕神刀·龙雩集舞刀法_河南萌新联赛2026第五场信息工程大学题面要点给定1 ≤ L R ≤ 10 6 1 \le L R \le 10^61≤LR≤106求max ⁡ L ≤ x ≤ R σ ( x ) x \max\limits_{L \le x \le R} \dfrac{\sigma(x)}{x}L≤x≤Rmax​xσ(x)​其中σ ( x ) \sigma(x)σ(x)为x xx的所有正因子之和答案为浮点数允许10 − 6 10^{-6}10−6误差。解题过程这个题很简单 用了一个新的筛法 倍数筛 普通暴力肯定会超时 用倍数筛1e6还是 可以过去的ad(x)是倍数枚举把 x 加到所有 x 的倍数上。x 是约数对于每一个倍数 x*ix 是它的一个约数累加得到 b[i]sigma(i)。这是埃氏筛思想求约数和这题完全就是一个「预处理约数和 区间扫一遍取最大」的模板题数据这么大绝对是没办法 暴力的实现代码#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define PLL pairll, ll #define YES coutYESendl; #define NO coutNOendl; using namespace std; const ll N1e6; const ll M1e-8; using namespace std; ll l,r; double maxx0; double b[1000005]; void ad(ll x) { for(ll i1;x*ir;i) { b[x*i]x; } } int main() { IOS cinlr; for(ll i1;ir;i) { ad(i); } for(ll il;ir;i) { b[i]b[i]/i; maxxmax(b[i],maxx); } coutfixedsetprecision(10)maxx; return 0; }知识点补充1.埃氏筛筛素数const int N1e65; bool vis[N]; void era(int n){ memset(vis,true,sizeof vis); vis[0]vis[1]false; for(int i2;in;i){ if(vis[i]){ for(int j2*i;jn;ji){ vis[j]false; } } } }倍数枚举求约数和约数个数小数据范围首选ll sigma[N]; //约数和 int d[N]; //约数个数 void get_div(int n){ for(int i1;in;i){ for(int ji;jn;ji){ sigma[j] i; d[j]; } } }2.欧拉筛线性筛每个合数只被最小质因子筛一次。const int N1e65; bool vis[N]; vectorint pri; void euler(int n){ for(int i2;in;i){ if(!vis[i]) pri.push_back(i); for(auto p:pri){ if(1LL*i*pn) break; vis[i*p]1; if(i%p0) break; } } }欧拉筛求约数个数const int N1e65; bool vis[N]; vectorint pri; int d[N]; int cnt[N]; //记录最小质因子的指数 void euler_d(int n){ d[1]1; for(int i2;in;i){ if(!vis[i]){ pri.push_back(i); d[i]2; cnt[i]1; } for(auto p:pri){ if(1LL*i*pn) break; vis[i*p]1; if(i%p0){ cnt[i*p]cnt[i]1; d[i*p]d[i]/(cnt[i]1)*(cnt[i*p]1); break; }else{ cnt[i*p]1; d[i*p]d[i]*d[p]; } } } }3.区间筛分段筛适用场景L,R可以很大比如 1012普通筛开不出 1012的数组所以用区间筛只维护长度为 R-L1的数组。#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); using namespace std; const int N1e65; bool vis[N]; vectorll pri; // 普通埃筛筛 sqrt(R) 以内质数 void era(int n){ memset(vis,true,sizeof vis); vis[0]vis[1]false; for(int i2;in;i){ if(vis[i]){ pri.push_back(i); for(int j2*i;jn;ji){ vis[j]false; } } } } // 区间筛 [L,R] vectorbool seg; void seg_sieve(ll L,ll R){ seg.assign(R-L1,true); if(L1) seg[0]false; //1不是质数 //拿所有sqrt(R)的质数去标记区间合数 for(ll p:pri){ ll st max(p*p, ((Lp-1)/p)*p); // L 的第一个p的倍数 for(ll jst;jR;jp){ seg[j-L]false; } } } int main() { IOS ll L,R; cinLR; ll sqrtRsqrt(R); era(sqrtR); seg_sieve(L,R); //遍历输出区间质数 for(ll i0;iseg.size();i){ if(seg[i]){ coutLiendl; } } return 0; }B 题DFS搜配方难度mediumB-冰碧帝皇蝎·冰帝之螯_河南萌新联赛2026第五场信息工程大学题面要点n nn种原料各有a i a_iai​个m mm种配方每种可用任意次用一次消耗一组固定原料并产出1 11个构件问能否把原料恰好全部用完若能求构件数的最小值否则输出− 1 -1−1。在这个题面中想求最小值要按平常肯定是选BFS但是在这里 幸好数据是非常小的直接用DFS就可以过的解题过程从题目中可以知道配方使用的次数 从数据范围方面可以知道 不会超过5回直接配方将次数从0-5次全部遍历dfs(step) 此时在处理第step套配方递归中循环的是在枚举配方的使用次数i并存入cnt中 然后递归处理下一个方案dfsstep1递归出口是当stepm1此时肯定已经将所有方案使用的次数 都遍历了一遍了当我们到这一步后就应该去判断这一套里的每个方案的次数是否是符合目的的 去尽量的找最小的情况在我们的出口 需要计算这套方案里所消耗多少 每种原料 在后续作为一个条件去判断是否合理resvmapstring,lltm; ll res0; for(ll i1;im;i) { //pf[i]存储第i个配方(原料名单次消耗数量) for(auto [u,v]:pf[i]) { //配方i使用cnt[i]次总消耗 次数 ×单次消耗 tm[u] cnt[i] * v; } res cnt[i]; //res总构件数 }校验消耗是否刚好等于手上原始原料resvbool oktrue; for(auto [u,v]:mp) //mp是题目给的原始原料库存 { if(tm[u]!v) { okfalse; break; } }实现代码#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define PLL pairll, ll #define YES coutYESendl; #define NO coutNOendl; using namespace std; const ll N1e6; const ll inf200; using namespace std; ll n,m;ll ansinf; ll cnt[10]; mapstring,llmp; vectorpairstring, ll pf[N]; void dfs(ll step) { if(stepm1) { bool oktrue; mapstring,lltm; ll res0; for(ll i1;im;i) { for(auto [u,v]:pf[i]) { tm[u]cnt[i]*v; } rescnt[i]; } for(auto [u,v]:mp) { if(tm[u]!v) { okfalse; break; } } if(ok) { ansmin(res,ans); } return ; } for(ll i0;i5;i) { cnt[step]i; dfs(step1); } } int main() { IOS cinnm; for(ll i1;in;i) { string s; ll t; cinst; mp[s]t; } for(ll i1;im;i) { ll t; cint; while(t--) { string s; ll x; cinsx; pf[i].push_back({s,x}); } } dfs(1); if(ansinf) { cout-1endl; } else { coutansendl; } // coutfixedsetprecision(x) ; return 0; }
返回列表