1.1快排
//1.确定分界点x q[l] q[(l+r)/2] q[r] 或者随机
//2.调整范围 使得x的左边满足小于等于x,右边大于等于x
//3.递归处理左右两边
\#include<iostream>
\#include<string>
using namespace std;
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int x = q[l]; int i = l - 1; int j = r + 1;
while (i < j)
{
do i++; while (q[i] < q[l]);
do j--; while (q[j] > q[l]);
if (i < j)
{
int temp = q[i];
q[i] = q[j];
q[j] = temp;
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
}
int main()
{
int n; scanf("%d", &n);
const int MAX = 1e6 + 10;
int q[MAX];
for (int i = 0; i < n; i++) scanf("%d", &q[i]);
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i++) printf("%d ", q[i]);
return 0;
}
1.2归并排序
//1.确定分界点 mid
//2.递归排序 left right
//3.归并 --- 合二为一
\#include<iostream>
using namespace std;
const int N = 1000010;
int n;
int q[N], tmp[N];
void merge_sort(int q[], int l,int r)
{
if(l >= r) return ;
int mid = l + r >> 1;
merge_sort(q, l, mid),merge_sort(q, mid+1, r);
int k = 0, i = l, j =mid + 1;
while(i <= mid && j <= r)
{
if(q[i] <= q[j])
{
tmp[k++] = q[i++];
}
else
tmp[k++] = q[j++];
}
while (j <= mid) tmp[k++] = q[i++];
while (j <= r) tmp[k++] = q[j++];
for(i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];
}
int main()
{
scanf("%d",&n);
for(int i = 0; i < n; i++) scanf("%d",&q[i]);
merge_sort(q, 0, n-1);
for(int i = 0; i < n; i++) printf("%d",q[i]);
return 0;
}
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。
对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。
如果数组中不存在该元素,则返回 -1 -1。
输入格式
第一行包含整数 n 和 q,表示数组长度和询问个数。
第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。
接下来 q 行,每行包含一个整数 k,表示一个询问元素。
输出格式
共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置
如果数组中不存在该元素,则返回 -1 -1。
\#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
int q[N];
int main(){
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++) scanf("%d", &q[i]);
for(int i = 0; i < m; i++){
int a;
scanf("%d", &a); //给定一个数值, 找出他的最左端位置和最右端位置
int l = 0, r = n - 1;
while(l < r){
int mid = l + r >> 1;
if(q[mid] >= a) r = mid;
else l = mid + 1;
}
if(q[l] != a) printf("-1 -1\n");
else {
printf("%d ", l);
l = 0, r = n - 1;
while(l < r){
int mid = l + r + 1 >> 1;
if(q[mid] <= a) l = mid;
else r = mid - 1;
}
printf("%d\n", r);
}
}
return 0;
}
\#include<bits/stdc++.h>
using namespace std;
const int N = 110 ;
char a[N] , b[N] ;
int s[N] ;
int main()
{
cin >> a + 1 >> b + 1 ; //下标从一开始输入
int n = max(strlen(a + 1),strlen(b + 1)) ;
reverse(a + 1 , a + 1 + strlen(a + 1)) ; // 翻转字符a数组
reverse(b + 1 , b + 1 + strlen(b + 1)) ; // 翻转字符b数组
// 从个位开始相加 结果储存到s数组里面
for(int i = 1 ; i <= n ; i ++)
{
if(a[i] && b[i]) s[i] = a[i] - '0' + b[i] - '0' ;
else if(a[i] && !b[i]) s[i] = a[i] - '0' ;
else s[i] = b[i] - '0' ;
}
// 模拟逢十进一的过程
for(int i = 1 ; i <= n ; i ++)
{
int m = s[i] / 10 ;
s[i] = s[i] % 10 ;
s[i + 1] += m ;
}
if(s[n+1]) cout << s[n+1] ;
for(int i = n ; i >= 1 ; i --) cout << s[i] ;
return 0;
}
2
2.1遇到7的倍数或者个位为7的数
遇到7的倍数或者个位为7的数则击掌代替次数c
c = n / 7 + (n + 3) / 10 - (n + 63) / 70;
2.2素数
2.3数组取代复杂分支语句
计算xxxxxx星期几
2.2字符串操作函数
结果:
char arr[100];
memset(arr,'a',10);
2.3快排
个位数小的 放在前面
2.4结构体char输入
strcpy(stu.szName,"Tom");//输入结构体char
2.4 静态变量
目的是 找到分数低于score 的最高数