基础知识讲解链接
785 快速排序
答案
#include<bits/stdc++.h>
const int N = 1e5 + 10;
using namespace std;
int dp[N];
void quick_sort(int q[], int l, int r) {
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j) {
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
int main(){
//ios::sync_with_stdio(0);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&dp[i]);
//sort(dp,dp+n);
quick_sort(dp,0,n-1);
for(int i=0;i<n;i++) printf("%d ",dp[i]);
return 0;
}
786 第k个数
答案
#include<bits/stdc++.h>
const int N = 1e5 + 10;
using namespace std;
int dp[N];
void quick_sort(int q[], int l, int r) {
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j) {
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
int main(){
//ios::sync_with_stdio(0);
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) scanf("%d",&dp[i]);
//sort(dp,dp+n);
quick_sort(dp,0,n-1);
printf("%d\n",dp[k-1]);
return 0;
}
787 归并排序
答案
#include<bits/stdc++.h>
const int N = 1e5 + 10;
using namespace std;
int dp[N];
int vp[N];
void merge_sort(int l,int r){
if(l>=r) return ;
int mid=l+r>>1;
merge_sort(l,mid);
merge_sort(mid+1,r);
int i=l;
int j=mid+1;
int tot=0;
while(i<=mid&&j<=r){
if(dp[i]<=dp[j]) vp[tot++]=dp[i++];
else vp[tot++]=dp[j++];
}
while(i<=mid) vp[tot++]=dp[i++];
while(j<=r) vp[tot++]=dp[j++];
for(int i=l,j=0;i<=r;i++,j++) dp[i]=vp[j];
}
int main(){
//ios::sync_with_stdio(0);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&dp[i]);
//sort(dp,dp+n);
merge_sort(0,n-1);
for(int i=0;i<n;i++) printf("%d ",dp[i]);
return 0;
}
788 逆序对的数量
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e5 + 10;
using namespace std;
int dp[N];
int vp[N];
ll res;
void merge_sort(int l,int r){
if(l>=r) return ;
int mid=l+r>>1;
merge_sort(l,mid);
merge_sort(mid+1,r);
int i=l;
int j=mid+1;
int tot=0;
while(i<=mid&&j<=r){
if(dp[i]<=dp[j]) vp[tot++]=dp[i++];
else vp[tot++]=dp[j++],res+=mid-i+1;
}
while(i<=mid) vp[tot++]=dp[i++];
while(j<=r) vp[tot++]=dp[j++];
for(int i=l,j=0;i<=r;i++,j++) dp[i]=vp[j];
}
int main(){
//ios::sync_with_stdio(0);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&dp[i]);
//sort(dp,dp+n);
merge_sort(0,n-1);
printf("%lld\n",res);
return 0;
}
789 数的范围
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e5 + 10;
using namespace std;
int dp[N];
int main(){
int n,q;
cin>>n>>q;
for(int i=0;i<n;i++) cin>>dp[i];
while(q--){
int k;
cin>>k;
int l=0;
int r=n-1;
while(l<r){
int mid=l+r>>1;
if(dp[mid]>=k) r=mid;
else l=mid+1;
}
//cout<<l<<" "<<r<<endl;
if(dp[l]!=k) cout<<"-1 -1"<<endl;
else{
cout<<l<<" ";
l=0;
r=n-1;
while(l<r){
int mid=l+r+1>>1;
if(dp[mid]<=k) l=mid;
else r=mid-1;
}
cout<<r<<endl;
}
}
return 0;
}
790 数的三次方根
注意:
- 负数
- 小数需要放大
答案
#include<bits/stdc++.h>
#define ll long long
#define eps 1e-8
const int N = 1e5 + 10;
using namespace std;
int main(){
double n;
cin>>n;
bool flag=0;
if(n<0){
flag=1;
n=-n;
}
double l=0;
double r=100*n;
while(r-l>eps){
double mid=(l+r)/2;
//cout<<mid<<endl;
if(mid*mid*mid>=n) r=mid;
else l=mid;
}
if(flag) cout<<"-";
cout<<fixed<<setprecision(6)<<l<<endl;
return 0;
}