作业介绍
归并排序
#include <bits/stdc++.h>
using namespace std;
int n;
int a[105];
//合
//left是左半边区域的左边界,mid是左半边区域的右边界,right是右半边的右边界
void hebing(int a[], int left, int mid, int right){
//l1,r1分别表示左半边区域的左右边界
//l2,r2分别表示右半边区域的左右边界
int b[105] = {}; //b数组作为中间数组
int idx = left; //从b数组的第left个位置存放,因为a数组是从left-》right
int l1=left, r1=mid, l2=mid+1, r2=right;
while(l1<=r1 && l2<=r2){ //左半边区域 和 右半边区域都还有数字
if(a[l1] <= a[l2]) b[idx] = a[l1], idx++, l1++;
else b[idx] = a[l2], idx++, l2++;
}
//假设左半边区域没有放完
while(l1<=r1) b[idx] = a[l1], idx++, l1++;
//假设右半边区域没有放完
while(l2<=r2) b[idx] = a[l2], idx++, l2++;
//按照顺序把中间数\组的数字放入a数组
for(int i=left; i<=right; i++) a[i] = b[i];
}
//分
void fen(int a[], int left, int right){
if(left<right){
int mid = (left+right) / 2;
fen(a, left, mid); //分左半边
fen(a, mid+1, right); //分右半边
hebing(a, left, mid, right); //把左右合并
}
}
int main(){
cin >> n;
for(int i=1; i<=n; i++) cin >> a[i]; //乱序数组
fen(a, 1, n);
for(int i=1; i<=n; i++) cout << a[i] << " ";
return 0;
}
二分答案
在单调符合答案的范围中找到极值
最小值最大化模板
//如果要求的内容在某个值以下的范围,要求这个范围的最大值
while(l<=r){
int mid=l+r>>1;
if(f(mid)) r = mid-1;
else l = mid+1;
}
cout << r;
最大值最小化模板
//如果要求的内容在某个值以上的范围,要求这个范围的最小值
while(l<=r){
int mid=l+r>>1;
if(f(mid)) l = mid+1;
else r = mid-1;
}
cout << l;
文件读写
freopen("D.in", "r", stdin);
freopen("D.out", "w", stdout);
第1题代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,c; //n表示n个牛棚,c表示有c头牛互相不服要干架
int a[N]; //a[i]表示第i个牛棚的位置
bool buheli(int mid){
//xianfangdiyitouniu,baozhengzhishaoyouyitouniukeyifang
int cnt = 1; //先放第一头牛,保证至少有一头牛可以放
int now = 1; //设置最近的这头牛的位置
for(int i=2; i<=n; i++){ //遍历2-n的位置,看能否放新牛
//第i个位置和现在的牛的位置距离大于等于mid
if(a[i] - a[now] >= mid){
cnt++;
now = i;
}
}
return cnt<c;
}
int main() {
cin >> n >> c;
for(int i=1; i<=n; i++) cin >> a[i];
sort(a+1, a+1+n);
//二分:两头牛之间的最短距离
int l=1, r=a[n];
while(l<=r){
int mid = (l+r) / 2; //假设两头牛之间的最短距离是mid
if(buheli(mid)) r = mid-1; //距离是mid的时候不合理
else l = mid+1; //距离是mid的时候合理
}
cout << r;
return 0;
}
- 状态
- 已结束
- 题目
- 3
- 开始时间
- 2024-3-16 0:00
- 截止时间
- 2024-3-24 23:59
- 可延期
- 24 小时