文章目录
A.Weird Flecks, But OK
- A.Weird Flecks, But OK
- 题意
- 解题思路
- Code
- D.Some Sum
- 题意:
- 解题思路
- Code
- E.Early Orders
- 题意:
- 解题思路
- Code
- F.Pulling Their Weight
- 题意
- 解题思路
- Code
- H.On Average They're Purple
- 题意
- Code
- J.This Ain't Your Grandpa's Checkerboard
- 题意
- 解题思路
- Code
传送门
题意给你n个点的三维坐标,然后给你一个圆柱形的钉子,问你钉子的直径最小为多大的时候,能够将这n个点在三维空间中覆盖,钉子只能垂直覆盖
解题思路通过分析我们可以发现我们只需要求三个面的最小圆覆盖面的直径就行,暴力每个点的复杂度为O(N^3),此时的N为5k,显然是不行的,所以我们可以使用Welzl 算法,对三个面算出最小覆盖圆的直径,然后取min,注意的是,有的面算出来可能为0,我们将0删掉即可,时间复杂度为O(N)
Code#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define eps 1e-8
#define inf 999999.0
#define zero(a) fabs(a)n;
if(n&1) {
puts("Either");
}
else {
n/=2;
if(n&1)
puts("Odd");
else
puts("Even");
}
}
E.Early Orders
传送门
题意:输入一个n和k,然后给你n个数,每个数都是在1 ~ k范围内的,问你找到一个子序列,该子序列满足1 - k的每个数都出现且只能出现一次,并且字典序最小
解题思路我们从前往后在这n个数里面选够k个满足条件的数,尽量选择字典序小的数,我们可以用一个单调栈,实现选择字典序最小,用ans数组记录这个字典序最小的答案,当我们枚举到了第i个数的时候,我们先比较ans最后一位数和当前第i位数的大小关系,如果当前第i位数比ans数组最后一位数小,且ans数组最后一位数在后面仍然存在,就可以将ans最后一位数去掉,一直到不满足条件,最后将第i位数放入ans数组末尾,这样就可以得到一个字典序最小的满足条件的子序列
Code#include
using namespace std;
const int N = 200005;
int a[N];
int cnt[N];//记录的是cnt[i]在当前位置后存在的个数
int ans[N];//记录最优解
bool vis[N];//记录是否已经被ans选中
int n,k;
int main()
{
scanf("%d%d",&n,&k);
for(int i = 1;i a[i] && cnt[ans[top]]) {//选择最优的操作
vis[ans[top]] = false;
--top;
}
ans[++top] = a[i];
vis[a[i]] = true;
}
for(int i = 1;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?