2021年牛客暑期多校训练营6
2021年牛客暑期多校训练营6
A Contracting Convex Hull(待)
题意:
题解:
注意:
代码:
B Defend Ponyville(待)
题意:
题解:
注意:
代码:
C Delete Edges
题意:
首先给定一个有n个结点的完全图 如果存在三个点x,y,z相连的三条边x-y x-z y-z 都还存在,那么就删去这三条边,若干次操作之后,求一种构造,使得图此时总边数≤n。 输出每次操作时候,所选取的三个点
题解:
详情参考 通过给这三个点构造一定的数学关系,使得这些组成的三元组足够多,以至于能满足总边数≤n的条件。这里我们构造出来的是三个点的和是n的整数倍,解之后发现是满足条件的,
我也不知道怎么解的orz
所以只要考察i+j+k是n的整数倍即可
注意:
k<=0的时候要加上n,i,j,k有按照从小到大的顺序,这样就不会有重复的情况
代码:
#include<bits/stdc++.h>
using namespace std;
struct tripe{
int x,y,z;
tripe(int _x,int _y,int _z):x(_x),y(_y),z(_z){}
};
vector<tripe>ans;
int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
int k=n-j-i;
if(k<=0)k+=n;
if(k<=j||k==i)continue;//i,j,k都不相等
ans.push_back({i,j,k});
}
}
printf("%d\n",ans.size());
for(auto it:ans)
printf("%d%d%d\n",it.x,it.y,it.z);
return 0;
}
D Gambling Monster(待)
题意:
题解:
注意:
代码:
E Growing Tree(待)
题意:
题解:
注意:
代码:
F Hamburger Steak
题意:
有n个汉堡和m个锅,每个汉堡i如果在一个锅里面所需要的炸制时间为 ,也可以放在两个锅里,可以分成两个时间段炸制,这样的话,从0s开始炸制,问将所有的汉堡炸制完所需要的时间最少是多少。(锅一次只能放一个汉堡🍔)
题解:
详情参考 贪心
首先对于所有锅来说,它总的煎制时间是大于等于所有汉堡总共所需的时间的,而锅最长的煎制时间T
也就是说每一个锅最多只能使用T,时间到了就只能得使用下一口锅了
注意:
向上取整别忘了,注意一下当汉堡分成两次炸制的情况,有两口锅的时间2 (0,ham[i]-T) 1 (ans-T,ans)
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+6;
typedef long long ll;
ll ham[maxn];
int main()
{
int n,m;ll maxm=0,ans=0,T,k;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&ham[i]);
ans+=ham[i];
maxm=max(maxm,ham[i]);
}
if(ans%m!=0)k=ans/m+1;//向上取整
else k=ans/m;
ans=max(k,maxm);
ll pan=1;//当前使用的锅
T=ans;//T表示的是当前这口锅所剩余的煎制时间
for(int i=1;i<=n;i++){
if(T>=ham[i]){
printf("1 %lld %lld %lld\n",pan,ans-T,ans-T+ham[i]);//能一次性煎完
T-=ham[i];
if(T==0){
pan++;
T=ans;
}
}
else {
printf("2 %lld 0 %lld %lld %lld %lld\n",pan+1,ham[i]-T,pan,ans-T,ans);
pan++;
T=ans-(ham[i]-T);
}
}
return 0;
}
G Hasse Diagram(待)
题意:
题解:
注意:
代码:
H Hopping Rabbit(待)
题意:
在一个二维的直角坐标系中,存在很多个矩形陷阱,小兔子能沿着x轴或者跳跃d步,跳跃次数随意,现在问存不存在一个点(x,y)使得小兔子不管如何跳跃都能够不落入陷阱当中
题解:
详情参考 前置知识:线段树 因为小兔子跳跃的点都是具有周期性,那我们可以将整个坐标系分成d*d的矩形块,以这些矩形中小兔子到达的位置为基准点,让这些点重合到一个矩形中,此时也就是说,小兔子始终在原点,这个时候我们再把所有矩形块上的矩形陷阱并上去,如果矩形长或者宽大于d,说明矩形一定是横向或者纵向覆盖了(0,d-1),如果长或者宽没有超过d说明它并没有完全覆盖,有两种可能,一种是在范围中间[x1,x2],第二种是被拆成了两块 [1,x1] [x2,d]。那么没有被覆盖的位置就是不会有陷阱的地方,也就是题目所要求得小兔子的位置
也就是说这个题目转换成求矩形的面积并 通过扫描线 求出来
注意:
代码:
I Intervals on the Ring
题意:
给定m个区间,问1~n范围内有哪些区间的交是这些给定区间的并
例如:n=4,m=2; 1~1 3~3 输出:1~3 3~1
题解:
已知德摩根律 集合并的补等于集合补的交 。设全集U由A+B两个大集合组成,要求的集合设为X,即求
下面有一张详细一点的图解

注意:
因为这个区间是一个环,所以补集只要将区间左右的数颠倒一下即可
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
struct node{
int l,r;
}a[maxn];
bool cmp(node a,node b){
return a.l<b.l;
}
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",&a[i].l,&a[i].r);
}
sort(a,a+m,cmp);
cout<<m<<endl;
for(int i=0;i<m;i++){
printf("%d %d\n",a[i].l,a[(m+i-1)%m].r);
}
}
return 0;
}
J Defend Your Country(待)
题意:
题解:
注意:
代码:
K Starch Cat(待)
题意:
题解:
注意:
代码:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具