Codeforces Round #801 (Div. 2) and EPIC Institute of Technology Round A - D

题目链接

0|1A

#include <iostream> #include <cstring> #include <algorithm> using namespace std; #define int long long const int N = 1e3 + 10; int n, m; int g[N][N]; int x, y, maxv; int area; int get(int x, int y) { return max(max( x * y , (n - x + 1) * y) , max( (n - x + 1) * (m - y + 1) , (m - y + 1) * x)); } void solve() { cin >> n >> m; area = 0 , maxv = -1e18; for(int i = 1 ; i <= n ; i ++ ) for(int j = 1 ; j <= m ; j ++ ) { int x; cin >> x; if(x > maxv) { maxv = x; area = get(i, j); } else if(x == maxv && get(i, j) < area) { maxv = x , area = get(i, j); } } cout << area << endl; } signed main() { int T; cin >> T; while(T -- ) solve(); return 0; }

1|0B

核心思路

其实像这种博弈论的题目我们应该首先就从n的奇偶性讨论。这里有一个很重要的性质:当n为偶数的时候就是其实这两个人分的石子堆是确定了的。

  • n为奇数:这个很显然只要Mike刚开始把第一堆拿了,那么就肯定是joe输了
  • n为偶数:首先我们可以贪心的考虑,每个人都不想输,所以每个人都尽量少拿石子:也就是每次只拿一个。所以看最少那堆石子花落谁家就好了。
// Problem: B. Circle Game // Contest: Codeforces - Codeforces Round #801 (Div. 2) and EPIC Institute of Technology Round // URL: https://codeforces.com/contest/1695/problem/B // Memory Limit: 256 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org) #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc++.h> using namespace std; typedef long long LL; #define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define NO {puts("NO") ; return ;} #define YES {puts("YES") ; return ;} #define endl "\n" #define int long long void solve() { int n; cin>>n; vector<int> a(n); for(int i=0;i<n;i++) { cin>>a[i]; } if(n%2==1) { cout<<"Mike"<<endl; return; } int smallest=0; for(int i=0;i<n;i++) { if(a[i]<a[smallest]) smallest=i; } if(smallest%2==0) cout<<"Joe\n"; else cout<<"Mike\n"; } signed main() { int T; cin>>T; while(T--) { solve(); } }

2|0C

核心思路

首先我们应该分析我们到达终点需要走多少步,这个还是比较容易分析出来的。那就是n+m-2步。而我们想要出现0.我们会发现我们走奇数步是完全不可能出现的,所以最终的答案肯定是偶数步。

挖掘出来这个性质就比较好做了:方格里面只有-1和1,所以我们走两步肯定只有-2 0 2这三种取值。

所以我们可以先预处理出来走到终点的最大值和最小值,这个使用dp就好了。然后判断0在不在这个范围了。

还有一点就是如果我们的最大值或者是最小值是奇数的话,由上面的分析可知道这一定走不到0的。

// Problem: C. Zero Path // Contest: Codeforces - Codeforces Round #801 (Div. 2) and EPIC Institute of Technology Round // URL: https://codeforces.com/contest/1695/problem/C // Memory Limit: 256 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org) #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc++.h> using namespace std; typedef long long LL; #define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define NO {puts("NO") ; return ;} #define YES {puts("YES") ; return ;} #define endl "\n" #define int long long const int N=1e3+10; int g[N][N],maxn[N][N],minn[N][N]; void solve() { int n,m; cin>>n>>m; //不需要memset。要不然会tle。 for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>g[i][j]; } maxn[0][0]=g[0][0]; minn[0][0]=g[0][0]; for(int i=1;i<n;i++) maxn[i][0]=minn[i][0]=maxn[i-1][0]+g[i][0]; for(int i=1;i<m;i++) maxn[0][i]=minn[0][i]=maxn[0][i-1]+g[0][i]; for(int i=1;i<n;i++) { for(int j=1;j<m;j++) { minn[i][j]=min(minn[i-1][j],minn[i][j-1])+g[i][j]; maxn[i][j]=max(maxn[i-1][j],maxn[i][j-1])+g[i][j]; } } if(maxn[n-1][m-1]%2||minn[n-1][m-1]>0||maxn[n-1][m-1]<0||minn[n-1][m-1]%2) { NO; } else { YES; } } signed main() { int T; cin>>T; while(T--) { solve(); } }

3|0D

题意

就是我们可以有k次询问,我们知道其他的点和k个点的距离。问我们最少询问多少次,可以确定每一个点的位置。

核心思路

easy:

首先我们需要知道的就是我们既然要确定以u为根的节点,那么就肯定需要把他的子树v全都确定了。并且如果有x个子树的答案是0,那我们就还需要加上x-1.因为我们最多只可以有1个节点没有确定。

hard:

我们需要优化时间复杂度,因为easy版本的我们需要做n次dfs,所以时间复杂度就是O(n2).我们可以从每个点的出度来优化。因为只要有子节点的出度小于3,那么他就肯定是一条链,而链我们只需要取他的任意端点就可以确定了。

// Problem: D1. Tree Queries (Easy Version) // Contest: Codeforces - Codeforces Round #801 (Div. 2) and EPIC Institute of Technology Round // URL: https://codeforces.com/contest/1695/problem/D1?mobile=true // Memory Limit: 256 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org) #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc++.h> using namespace std; typedef long long LL; #define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define NO {puts("NO") ; return ;} #define YES {puts("YES") ; return ;} #define endl "\n" #define int long long const int N=1e6+10; vector<int> tree[N]; int dfs(int u,int fa) { int sum=0,z=0; for(auto v:tree[u]) { if(v!=fa) { int x=dfs(v,u); sum+=x; if(!x) z++; } } return sum+max(z-1,1LL*0); } void solve() { int n; cin>>n; int ans=n; int m=n; m--; while(m--) { int u,v; cin>>u>>v; tree[u].push_back(v); tree[v].push_back(u); } int max_dep=0; for(int i=1;i<=n;i++) { max_dep=max(max_dep,(int)tree[i].size()); } if(max_dep==0) { cout<<0<<endl; } else if(max_dep<3) { cout<<1<<endl; } else { for(int i=1;i<=n;i++) { if(tree[i].size()>=3) { cout<<dfs(i,i)<<endl; break; } } } for(int i=1;i<=n;i++) tree[i].clear(); } signed main() { int T; cin>>T; while(T--) { solve(); } }

__EOF__

本文作者肖英豪
本文链接https://www.cnblogs.com/xyh-hnust666/p/17070559.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   努力的德华  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示