【EOJ Monthly】2021.3

2024-01-21 14:40
文章标签 monthly eoj 2021.3

本文主要是介绍【EOJ Monthly】2021.3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A:读不懂古神语的程序员不是一个合格的探险家

  挺好玩的一个题1。其实按照题意来说就是一个环,从最小值到最大值都是递增的,从一号结点拆开也就是一个二次函数或者三次函数,让你找最值。一开始写了一个普普通通的三分代码,其实会有一个很致命的问题就是越界的问题(针对于三次函数并不是单峰的情况)。后来发现了一种很妙的代码:就是在左端点和中点的下一个点去判断这个上升/下降趋势,然后分类讨论:

#include<bits/stdc++.h>
using namespace std;
const int maxn=(1<<20)+100;
int vis[maxn],n;
int Query(int x)
{if(vis[x]!=-1) return vis[x];printf("? %d\n",x);fflush(stdout);int num;scanf("%d",&num);if(num==(1<<n)) {printf("! %d\n",x);fflush(stdout);exit(0);}vis[x]=num;return vis[x];
}
int main()
{scanf("%d",&n);int l=1,r=1<<n;memset(vis,-1,sizeof(vis));while(l<r){int mid=(l+r)>>1;bool jud1=Query(l)<Query(l+1),jud2=Query(mid)<Query(mid+1);if(jud1 && jud2){if(Query(l)<Query(mid)) l=mid;else r=mid;}else if(!jud1 && !jud2){if(Query(l)<Query(mid)) r=mid;else l=mid;}else if(jud1 && !jud2)  r=mid;else l=mid;}
}

B:我想把我的心意叠成小小的一块塞进你的心里

  挺好玩的一个题2。其实我们很容易发现这是一个贪心题,从叶子结点开始,一层层往上折,折到不能继续折下去了就结束。但其实我们发现,对于一个结点 u u u来说,如果他有 k k k个子结点,那么处理一次就会到达 O ( k 2 ) O(k^2) O(k2)(可以假想前面有一个空子树,然后检查一个合并一个,直到所有的子结点都被检查),然后还得递归地去检查合并后子树的子树中有没有还需要再次合并的,时间复杂度太高,而且对于链式前向星的这种存图方式来说,删边还需要很多操作(类似链表)。
  题解给出了一种很神奇的做法,就是新建一棵虚拟的树 T ′ T' T,合并子树的操作变成了指针的来回移动,递归的同时就完成了合并的操作,步骤其实可以画图理解一下。

#include<bits/stdc++.h>
#define close ios::sync_with_stdio(false)
using namespace std;
const int maxn=1e5+100;
struct Edge{int to,w;Edge(int a,int b):to(a),w(b){}
};vector<Edge> e1[maxn],e2[maxn];
int val[maxn],p;
void DFS1(int root,int fa)
{for(Edge u:e1[root]){if(u.to==fa) continue;int rec=p;bool change=false;for(Edge v:e2[p])if(u.w==v.w && val[u.to]==val[v.to]) {change=true;p=v.to;break;}if(!change){e2[p].push_back(Edge(u.to,u.w));e2[u.to].push_back(Edge(p,u.w));p=u.to;}DFS1(u.to,root);p=rec;}
}
int DFS2(int root,int fa)
{int ans=1;for(Edge u:e2[root]){if(u.to==fa) continue;ans+=DFS2(u.to,root);}return ans;
}
int main()
{close;int n;cin>>n;for(int i=1;i<=n;++i) cin>>val[i];for(int i=1;i<n;++i){int x,y,w;cin>>x>>y>>w;e1[x].push_back(Edge(y,w));e1[y].push_back(Edge(x,w));}p=1;DFS1(1,-1);cout<<DFS2(1,-1)<<endl;
}

C:不会吧不会吧不会这道题还有同学答案错误吧

  挺好玩的一个题3。没啥能说的,直接生成一个树的数据,然后写一个bat脚本,用题目给的测试文件测试答案即可(这里我把题目给的测试文件输出结果用,隔开)。
  生成树的数据,我是先在数组中存放1~n,然后使用random_shuffle打乱,然后从第二个结点开始随机为其分配父结点的id。然后写一个bat脚本将题目给的std文件输出的结果自动进行比较(大约跑了2k次?反正我生成的树就是随机的,没啥特殊的 )放上bat脚本。

@echo off
:looprand.exe %random% >input.txtstd.exe < input.txt > stdout.txtfor /f "tokens=1,2 delims=," %%i in (stdout.txt) do (echo %%i %%jif %%i lss %%j pause)
goto loop

D:关于小方的爆款桌游还没面世就要夭折这回事

  这个题挺一般的,一个常见的对称放置的套路。如果列数,行数的一半都是奇数的话,就放正中心,后面跟着别人对称摆放一定赢;如果不是中心的话,别人跟着你对称摆放就一定输。

E:蟹老板的梦幻传送门真的能让宅男走出家门吗

  挺好玩的一个题4。题解给的是先排个序,然后我们可以假设存在某个分界线 a i ∈ [ 1 , n ] a_i\in [1,n] ai[1,n],左区间都走左边的传送门,右区间都走的右边的传送门,那么自然我们就得把传送门设在区间的中间: X = a 1 + a i 2 , Y = a i + 1 + a n 2 X=\frac{a_1+a_i}{2},Y=\frac{a_{i+1}+a_n}{2} X=2a1+ai,Y=2ai+1+an,然后我们就可以得到 d ( i , j ) = m a x ( X − a 1 + a n − Y , a i − a 1 , a n − a i + 1 ) = m a x ( a i − a 1 + a n − a i + 1 2 , a i − a 1 , a n − a i + 1 ) = m a x ( a i − a 1 , a n − a i + 1 ) d(i,j)=max(X-a1+a_n-Y,a_i-a1,a_n-a_{i+1})=max(\frac{a_i-a_1+a_n-a_{i+1}}{2},a_i-a_1,a_n-a_{i+1})=max(a_i-a_1,a_n-a_{i+1}) d(i,j)=max(Xa1+anY,aia1,anai+1)=max(2aia1+anai+1,aia1,anai+1)=max(aia1,anai+1),这样问题就可以在 O ( n ) O(n) O(n)的时间内解决了。

这篇关于【EOJ Monthly】2021.3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/629871

相关文章

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

POJ3273-Monthly Expense (最小化最大值)

题目链接:click here~~ 【题目大意】  农夫JF在n天中每天的花费,要求把这n天分作m组,每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值 【解题思路】: 经典的最小化最大值问题,要求连续的m个子序列,子序列的和最大值的最小,枚举满足条件的m的最小值即为答案,因此二分查找。 1.是否能把序列划分为每个序列之和不大于mid的m个子序列

135 - ZOJ Monthly, August 2014

135 - ZOJ Monthly, August 2014 A:构造问题,判断序列奇偶性,很容易发现最小值不是1就是0,最大值不是n就是n - 1,注意细节去构造即可 E:dp,dp[i][j]表示长度i,末尾状态为j的最大值,然后每个位置数字取与不取,不断状态转移即可 G:就一个模拟题没什么好说的 H:dfs,每次dfs下去,把子树宽度保存下来,然后找最大值,如果有多个,就是

解决2021.3新版idea启动不了Sentinel的问题

大部分网上都是这样启动的,新版的idea会报错,加单引号,去空格什么都好不用. 下边改成这样!!!!: 先改成这个选项! 然后直接把下边第一行按这个输入: java '-Dserver.port=8180' '-Dcsp.sentinel.dashboard.server=localhost:8180' '-Dproject.name=sentinel-dashboar

POJ 3723 Monthly Expense 二分

题意:给你n个值,要求将其划分成m部分(顺序不能打乱),如何划分使得最大部分的值最小。 题解:二分,对于每一个中间值,检测一次。 #include<cstdio>int N, M;int spend[200000];bool check ( int num ){int i, sum, cnt = 0;for ( i = 0; i < N; ){sum = 0; cnt++;w

POJ 3273 Monthly Expense(二分)

题目链接:点击打开链接 题目大意是说给n个数,要求分成m组,必须连续的数才能合并成一个组,求满足ans大于等于每一组的和的最小ans(每个组可以只有1个数) 显然二分查找最小的ans //Must so#include<iostream>#include<algorithm>#include<string>#include<sstream>#include<queue>

156 - ZOJ Monthly, January 2019 - A Little Sub and Pascal's Triangle找规律

Little Sub is about to take a math exam at school. As he is very confident, he believes there is no need for a review. Little Sub’s father, Mr.Potato, is nervous about Little Sub’s attitude, so he gi

ZOJ Monthly, March 2018 A B C J H

A Easy Number Game 贪心 很容易想到,将数列排序 将前2n个数 掐头去尾的相乘求和 #include<iostream>#include<cstring>#include<algorithm>using namespace std;int T;int n,m;int s[100100];int main(){cin>>T;while(T--){cin>>n>>

EOJ-大学生程序设计邀请赛(华东师范大学)-I-七巧板

ACM模版 描述 题解 计算几何问题……不难,就是麻烦,精度问题也需要着重注意,注意人家输入精确到 10−12 10^{-12},而不是拼接时精确到 10−12 10^{-12}! 我是通过判断面积是否可以构成正方形(与最大边符合),三角形是否有五个,四边形是否有两个,七个多边形一共23条边排序后是否符合七巧板的规格等等,当然,我这个也不是最简单的,完全可以通过判断多边形之间各

PyCharm(2021.3.1最新版) 关闭连按两下shift出现全局搜索界面

关闭连按两下shift出现全局搜索界面 不只PyCharm,Jetbrain家族的编程软件其实都有连按shift召唤全局搜索的设定,这对需要进行频繁中英文切换的程序员的确不太友好,因此我想很多人会选择关闭这个功能! 但Python3.1版本以后按照以往网上说的通过设置,关闭全局搜索快捷键或Ctrl+Shift+A搜索registry,然后关闭ide.suppress.double.click.h