上午简单排序
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10;
struct T{
int x,y,z;
}a[N];
bool cmp(T a,T b){
return a.z < b.z; // 返回是否合法,或者说 是否不需要交换
}
double dis(int i,int j){
return sqrt(
pow(a[i].x - a[j].x, 2) +
pow(a[i].y - a[j].y, 2) +
pow(a[i].z - a[j].z, 2) );
}
int main(){
int n,x,y,z; cin>>n;
for(int i=1; i<=n; i++){
cin>>x>>y>>z; a[i] = {x,y,z};// c++11
}
sort(a+1, a+1+n, cmp);
double ans=0;
for(int i=1; i<n; i++) ans += dis(i, i+1);
cout<<fixed<<setprecision(3)<<ans;
return 0;
}
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,a[N];
bool cmp(int a,int b){
return a < b;
}
// 冒泡:每次比较两个相邻的数
int cnt=0; // 逆序对
void bubble_sort(){
for(int i=n; i>=1; i--)// 第 n-i+1 轮冒泡
for(int j=1; j<i; j++)
if(a[j] > a[j+1]) {
swap(a[j], a[j+1]);
cnt++; // 每次冒泡,就是解决一个逆序对
}
}
// 选择:选择最大的放在最后
void select_sort(){
for(int i=n; i>=1; i--){
int k = i; // 最大值的位置
for(int j=1; j<i; j++) if(a[k]<a[j]) k=j;
swap(a[k], a[i]);
}
}
// 插入:将当前元素插入到前面的有序序列中
void insert_sort(){
for(int i=2; i<=n; i++){
int k = i; // 要插入的元素位置
for(int j=i-1; j>=1; j--){
if(a[k] >= a[j]) break;
swap(a[k], a[j]), k=j;
}
}
}
int main(){
freopen("data.in", "r", stdin);
scanf("%d", &n);
for(int i=1; i<=n; i++) scanf("%d", &a[i]);
// sort(a+1, a+1+n); // 默认升序,less<int>()
// sort(a+1, a+1+n, cmp); // 自定义比较函数 cmp
// sort(a+1, a+1+n, less<int>()); // 升序 less<int>()
// sort(a+1, a+1+n, greater<int>()); // 降序 greater<int>()
// sort 本身内部封装 快速排序,堆排序,插入排序
// 快速排序:O(nlogn) 选择一个基准值 b,将元素分为两部分,左边 <b, 右边 >=b
// bubble_sort();
// select_sort();
insert_sort();
for(int i=1; i<=n; i++) printf("%d ", a[i]);
return 0;
}
下午二分
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,q,a[N];
// 二分查找:对于具有单调性的区间问题
int left(int l,int r,int x){ // 在 a[l,r] 寻找 x 的左边界
int ans=l; // [l,r] 任意值均可
while(l<=r){
int mid = l+r >> 1; // (l+r)/2;
if(a[mid] >= x) r=mid-1, ans=mid;
else l=mid+1;
}
if(a[ans]!=x) ans=-1; // 没找到
return ans;
}
int right(int l,int r,int x){ // 在 a[l,r] 寻找 x 的右边界
int ans=l; // [l,r] 任意值均可
while(l<=r){
int mid = l+r >> 1; // (l+r)/2;
if(a[mid] <= x) l=mid+1, ans=mid;
else r=mid-1;
}
if(a[ans]!=x) ans=-1; // 没找到
return ans;
}
int main(){
freopen("data.in", "r", stdin);
scanf("%d%d", &n,&m);
for(int i=1; i<=n; i++) scanf("%d", &a[i]);
int x;
while(m--){
scanf("%d", &x);
printf("%d ", left(1,n,x));
}
return 0;
}
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10;
int n,m,a[N];
// 检查当锯子高度为 x 是否合法:砍下的木材长度 s>=m
bool chk(int x){
LL s=0;
for(int i=1; i<=n; i++) s += max(a[i]-x, 0);
return s>=m;
}
int main(){
freopen("data.in", "r", stdin);
scanf("%d%d", &n,&m);
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
int l=0, r=1e9, ans=0;
while(l<=r){
int mid= l+r>> 1;
if(chk(mid)) l=mid+1, ans=mid;
else r=mid-1;
}
printf("%d\n",ans);
return 0;
}
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10;
int L,n,m,a[N];
// 检查最短跳跃距离 x 是否合法:移走的石头数量 s<=m。
bool chk(int x){
int s=0, p=0; // p 是当前所在位置
for(int i=1; i<=n+1; i++){ // p->i
if(a[i] - a[p] < x) s ++; // 如果 跳跃距离 <x,就移走 i
else p=i;
}
return s<=m;
}
int main(){
freopen("data.in", "r", stdin);
scanf("%d%d%d", &L,&n,&m);
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
a[0]=0, a[n+1] = L;
int l=1, r=L, ans=0;
while(l<=r){
int mid= l+r>> 1;
if(chk(mid)) l=mid+1, ans=mid;
else r=mid-1;
}
printf("%d\n",ans);
return 0;
}
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10;
int n,k,a[N];
// 检查长度为 x 是否合法:长度均为 x 的小段木头数量 s>=k。
bool chk(int x){
int s=0;
for(int i=1; i<=n; i++) s += a[i]/x;
return s >= k;
}
int main(){
freopen("data.in", "r", stdin);
scanf("%d%d", &n,&k);
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
int l=1, r=1e8, ans=0;
while(l<=r){
int mid= l+r>> 1;
if(chk(mid)) l=mid+1, ans=mid;
else r=mid-1;
}
printf("%d\n",ans);
return 0;
}
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=110;
const double eps = 1e-6;
int main(){
double n; cin>>n;
// cout<<(int)cbrt(n);
double l=0, r=1e5;
// while( r-l > eps){
// while( r-l > 1e-6 ){
for(int i=1; i<=100; i++){
double mid =(l+r)/2.0;
if(mid*mid*mid >=n ) r=mid;
else l=mid;
}
cout<<(int)r;
return 0;
}