2022年牛客竞赛六一儿童节题解~
嘿,这里是小沙组织的第一场比赛希望大家玩的都很开心~
感谢出题人小沙,嘤嘤,小七,琢喵,智乃,兰子的友情出题!
小沙:A
嘤嘤:CDF
小七:G
智乃:HI
琢喵:B
兰子:E
A
这是一道语法题
首先我们需要判断几个条件:
1.朋友和小沙的年龄差距不能超过3
2.朋友要会跑
3.小沙也是小朋友 也要会跑才行
#include<iostream> using namespace std; int main(){ int n,x,c; cin>>n>>x>>c; int ans=0; for(int i=1;i<=n;i++){ int p; cin>>p; if(p>=x-3&&p<=x+3&&p>=c) ans++; } printf("%d",((x>=c)?ans:0)); }
B
不知道有木有勾起大家的儿时回忆呢~
出题人の夹带私货:https://www.bilibili.com/video/BV19R4y1T7Ep
第一问:可以在这个链接中找到
http://web.4399.com/ddt/remendaoju/wq/3423-2.html
关于第二大问:
勇闯地穴:
C
解法一
810975什么意思?|【逗鱼时刻317期】片尾单品_哔哩哔哩_bilibili 视频1:40有正解。
解法二
提示中每行第一句的最后一个汉字连起来 = 衣锦夜行,B站搜索,即可得810975。
解法三
柯南的好基友+儿童节 --> 基德 --> KID --> 1412,打开文件夹找到1412,即可找到答案。
解法四
写一份代码,遍历文件夹,找到一个内容不同的文件。
解法五
来自一血的神奇做法,出题人一脸懵逼。
解法六
出题人意想不到的巧合。
D
第一个问题:
特判x=1和y=1,否则直接暴力乘即可。
第二个问题:
两个操作都会使数变小,所以优先操作大的数,若大的数无法操作,则无法完成。
第三个问题:
观察易知,对于从0开始的前 个数,二进制下 1 的个数为奇数的数有 个,并且此性质对于 共 个数也成立。所以只要算出 和 的二进制下 1 的个数为奇数的个数,减一下即可。
第四个问题:
让一行或一列的炮都往一个方向打,最终只能剩余两列,若一开始只有一行或一列,则行或列不能操作。所以答案是 。
第五个问题:
对于当前 件物品:
①若 能整除 ,则我们分成 堆,每堆有 件物品。我们把前 堆东西放到天平上,如果这 堆东西一样重,那说明重的那件物品在最后一堆中,否则天平可以告诉我们,重的那件物品在这 堆东西的哪堆中。
②若 不能整除 ,则我们分成 堆,前 堆每堆有 ( 要向下取整)件物品,最后一堆物品数小于等于 ,可证 一定小于等于 。我们把前 堆东西放到天平上,如果这 堆东西一样重,那说明重的那件物品在最后一堆中,否则天平可以告诉我们,重的那件物品在这 堆东西的哪堆中。
重复以上过程,最终便可找到重的那件物品,不难发现这个过程本质上就是求 (向上取整)的值。
最后求一个异或和即可。
小沙的代码如下:
#include<bits/stdc++.h> #define fre(z) freopen(z".in","r",stdin),freopen(z".out","w",stdout) #define range(x) begin(x), end(x) #define sz(x) (int)(x).size() #define pb push_back #define sto \ std::ios::sync_with_stdio(false); \ std::cin.tie(nullptr); \ std::cout.tie(nullptr); using namespace std; typedef long long ll; typedef pair<ll,ll> PII; ll lowit(ll x){ return x&-x; } inline ll read(){ ll x=0;char ch;bool f=true; for(ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')f^=f; for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+(ch^48); return f?x:-x; } void solve(){ ll a=read(),b=read(); auto f1=[&](ll a,ll b)->ll{ if(a==1)return 0; if(a>b)return 0; ll c=1; for(int i=0;;i++,c*=a) if(c>b)return i-1; return 0; }; auto f2=[&](ll a,ll b)->ll{ int ans1=0,ans2=0,ans3=0,ans4=0; while(a%5==0||b%5==0){ if(a%5==0)ans3++,a=a/5*3; if(b%5==0)ans4++,b=b/5*3; } while(a%3==0||b%3==0){ if(a%3==0)ans1++,a/=3; if(b%3==0)ans2++,b/=3; } if(a!=b)return 0; return abs(ans1-ans2)+abs(ans3-ans4); }; auto f3=[&](ll l,ll r)->ll{ if(l>r)swap(l,r); auto f=[&](ll n)->ll{ int x=n,cnt=0; while(x){ if(x&1)cnt++; x/=2; } int c=0; if(cnt%2==0)c+=n/2; else c+=(n-1)/2; return n-c; }; return f(r)-f(l-1); }; auto f4=[&](ll a,ll b)->ll{ return min(a,2ll)*min(b,2ll); }; auto f5=[&](ll n,ll m)->ll{ if(m==1)return 0; int res=0; while(n!=1){ res++; n=(n+m)/(m+1); } return res; }; cout<<(f1(a,b)^f2(a,b)^f3(a,b)^f4(a,b)^f5(a,b))<<"\n"; } int main(){ ll T=1; T=read(); for(int i=1;i<=T;i++)solve(); return 0; }
E
答案:
等 瞬间 丢铜板 因为是你 还是好朋友
qcjj搜索法(qcjj友情提供的题解)
我们可以发现,3. 一口吃下全部 看起来就非常的特别。那我们就看看能不能把这句对应的歌手搜出来
关键词,一口吃下全部 歌词
发现是王心凌的歌。结合时事,以及出题人,我们大概率就能确定歌手是王心凌了。
然后再开启万能搜索格式
"想哭了" 王心凌 歌词
"你是爱我的" 王心凌 歌词
"我为什么爱你" 歌词 王心凌
"不要想得太多" 歌词 王心凌
F
DJWCB
ELYSI
RNMTQ
AKXGU
OPHVF
A. 克蕾亚(克蕾亚·哈维,百套路战记,不熟)
B.艾斯(艾丝·华伦斯坦,在下求搞,天然呆)
C.莎夏(莎夏·涅库罗,魔王学院的不适格者,不太熟)
D.安洁莉娜(安洁莉娜·库都·希尔兹,抗世界神剧来访者篇,傲娇)
E.瑟莉卡(瑟莉卡·阿尔弗涅亚,不正经的魔术讲师与禁忌教典,涩姐姐)
F.DIO(DIO的奇妙冒险,金发傲娇吸血鬼)
G.拉娜·提耶儿(拉娜·提耶儿·夏尔敦·莱儿·凡瑟芙,Overload,变态+病娇?)
H.安洁莉卡(乙女游戏世界对路人角色很不友好,不太熟)
I.布蕾德(某知名异世界重生番,这个不好说,变态+百合)
J.菲丽希亚(百炼霸王与圣约女武神,不熟)
K.琉璃(失格纹的最强贤者,不熟)
L.莉夏(莉姿夏尔蒂·亚提司玛特,最弱无败的神装机龙,傲娇中的傲娇)
M.铃兰(明日方舟,zngg放的)
N.四门摩耶(圣剑使的禁咒咏唱,四大名著之一,不熟)
O.夏洛特(夏洛特·德诺阿,IS(无限无斯特拉托斯),名作之壁!!!不熟)
P.达克妮丝(为世界的美好献上祝福第二季第4话,变态+M)
Q.菲洛(盾之勇者憋屈录,可爱萝莉yyds)
R.艾莉亚莉亚(被神捡到的男人,不熟)
S.相泽梓(打了300年的史莱姆,不知不觉就练到了满级,不熟)
T.莉丝妲黛(这个勇者明明很强却过分慎重,不熟)
U.川建国(知名地下党员,金发傲娇!(嘴上说着讨厌**,但实际上做了很多让**非常喜欢+开心的事))
V.荧(屑妹妹!其实本来想玩考哥梗叫包包的,但想想还是算了,屑+屑+屑+屑+屑+屑+非常屑)
W.赛莉丝(赛莉丝缇雅·兰格莉思,最弱无败的神装机龙,大大大大姐姐)
X.艾莲(艾莲,关我姆事,搞笑担当?)
Y.月(贫穷职业造就业界最强,金发吸血鬼,不熟)
几乎所有角色都来源于异世界、龙傲天番剧,番剧名字基本可以在另一道融合怪题(D)的标题中找到。
不会真有人全看过吧?不会吧不会吧?
应该很简单吧,打开猛男百科随便搜一搜就有了,要是觉得难的话,下次来认下面这些京都脸
G
小乐的房间
输出编号①的房间的周围房间编号,以及自己即可(记得去重排序)
我们可以发现无论房间的布局是:(数字代表空间编号。下图右布局仅仅是反转左布局的第二列到最后一列)
此时两种布局的每个空间的相邻空间是一样的。
换句话说,此时对于任意一个空间 R,两种布局的R的相邻空间构成的集合都是相等的
同理,可以交换第一种布局的第二行到最后一行。这两种操作使得 1周围的空间都可以成为角落。
所以找出 1周围的点然后去重即可,n >= 3 输出9个坐标,n < 3 输出 1 ~ n * n
#include <bits/stdc++.h> constexpr int N = 1005 * 1005; int room[N][4]; signed main() { int len; std::cin.tie(nullptr)->sync_with_stdio(false); std::cin >> len, len *= len; for (int i = 1; i <= len; ++ i) { for (int j = 0; j < 4; ++ j) { std::cin >> room[i][j]; } } std::map<int, int> mp{{room[1][0], 2}, {room[1][1], 2}, {room[1][2], 2}, {room[1][3], 2}}; // 自动去重 for (int i = 0; i < 4; ++ i) { for (int j = 0; j < 4; ++ j) { ++ mp[room[room[1][i]][j]]; } } for (auto& i : mp) { if (i.second > 1) { std::cout << i.first << ' '; } } return 0; }
H
按题意模拟即可(好解)
出题人:写二分的反思一下。
I
这道题是上下界最小流的模板题,拆点模型也比较好建,不会做的话说明该补一补图论了。
对于一个城堡,我们可以将其分成三个阶段拆成三个点,分别为进攻、死亡、占领三个状态。
然后我们把流量看做是士兵按照题意:
1、因为必须要合力兵力达到D才能进攻,所以建边从进攻节点到死亡节点流量下界为D,上界INF(本题中所有边的上界都是INF,后面不再提了)
2、因为进攻后会死亡A人,所以建边从死亡节点到T下界流A回收流量。
3、因为结算后必须省1个人才能占领和招募,所以从死亡节点到占领节点建边下界1。
4、占领后贪心的直接招募到P人,所以从S节点下界先流P人到占领节点。
剩下的建边就按照原本的DAG图,建INF边连起来即可。
建图大概就如上图所示。
顺便一提,数据范围比较小,没有卡二分的最小流写法,但是最小流不会有人写二分版吧。
非二分版的最小流只需要三步,又好写又快:
1、求扩展源ss到扩展汇tt的最大流ans1。
2、连接汇点t->源点s的INF边构造循环流。
3、在残量网络上再次求扩展源ss到扩展汇tt的最大流ans2。
若ans1+ans2满流,则ans2为源s到汇t的最小流,否则源s到汇t无可行流无解。
因为贪心提前给每个城堡都招募了P人,所以最终答案要减去Σp,所以答案为ans2-Σp
想学习更多图论知识,欢迎购买牛客图论课程。
牛客竞赛图论课程:https://ac.nowcoder.com/courses/cover/live/740