CSP考了依托答辩,准备复习一下。
以博客园博文、ACwing题目还有做题为主要内容。
3.22
快排
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
inline int read() {
char c = getchar();
int x = 0, f = 1;
for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
return x * f;
}
int a[1000011];
void qsort(int l, int r) {
if (l >= r) return;
int x = a[l + r >> 1];
int i = l - 1, j = r + 1;
while (i < j) {
while (a[++i] < x);
while (a[--j] > x);
if (i < j) swap(a[i], a[j]);
}
qsort(l, j);
qsort(j + 1, r);
}
int main() {
int n = read();
for (int i = 1; i <= n; i++) a[i] = read();
qsort(1, n);
for (int i = 1; i <= n; i++) cout << a[i] << " ";
puts("");
return 0;
}
3.23
线性筛素数
#include <stdio.h>
const int A = 1e6 + 11;
const int B = 5e5 + 11;
int vis[A];
int n, q, pri[B], cnt;
int main() {
scanf("%d", &n);
vis[0] = 1, vis[1] = 1;
for (int i = 2; i <= n; i++) {
if (!vis[i]) pri[++cnt] = i;
for (int j = 1; j <= cnt && i * pri[j] <= n; j++) {
vis[i * pri[j]] = 1;
if (i % pri[j] == 0) break;
}
}
for (int i = 1; i < cnt; i++) {
if (pri[i + 1] - pri[i] == 2) printf("(%d,%d) ", pri[i], pri[i + 1]);
}
return 0;
}
3.25
https://blog.csdn.net/kexuanxiu1163/article/details/103051357
3.29
今天晚上做了一晚上数据结构已经恶心吐了,就不复健了,把写的代码整理到这里一下
status InitList(SqList& L)
// 线性表L不存在,构造一个空的线性表,返回OK,否则返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) {
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
else return INFEASIBLE;
/********** End **********/
}
status DestroyList(SqList& L)
// 如果线性表L存在,销毁线性表L,释放数据元素的空间,返回OK,否则返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
else {
free(L.elem);
L.elem = NULL;
L.listsize = 0;
L.length = 0;
return OK;
}
/********** End **********/
}
status ClearList(SqList& L)
// 如果线性表L存在,删除线性表L中的所有元素,返回OK,否则返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
else {
for (int i = 0; i < L.length; i++) L.elem[i] = 0;
L.length = 0;
return OK;
}
/********** End **********/
}
status ListEmpty(SqList L)
// 如果线性表L存在,判断线性表L是否为空,空就返回TRUE,否则返回FALSE;如果线性表L不存在,返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
else if (!L.length) return TRUE;
else return FALSE;
/********** End **********/
}
status ListLength(SqList L)
// 如果线性表L存在,返回线性表L的长度,否则返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
return L.length;
/********** End **********/
}
status GetElem(SqList L,int i,ElemType &e)
// 如果线性表L存在,获取线性表L的第i个元素,保存在e中,返回OK;如果i不合法,返回ERROR;如果线性表L不存在,返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
if (i < 1 || i > L.length) return ERROR;
else {
e = L.elem[i - 1];
return OK;
}
/********** End **********/
}
int LocateElem(SqList L,ElemType e)
// 如果线性表L存在,查找元素e在线性表L中的位置序号并返回该序号;如果e不存在,返回0;当线性表L不存在时,返回INFEASIBLE(即-1)。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
for (int i = 0; i < L.length; i++) {
if (L.elem[i] == e) return i + 1;
}
return ERROR; //若跳出循环一定没有找到,直接return ERROR
/********** End **********/
}
status PriorElem(SqList L,ElemType e,ElemType &pre)
// 如果线性表L存在,获取线性表L中元素e的前驱,保存在pre中,返回OK;如果没有前驱,返回ERROR;如果线性表L不存在,返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
pre = -1;
for (int i = 0; i < L.length; i++) {
if (L.elem[i] == e && i != 0) pre = L.elem[i - 1];
}
return (pre != -1) ? OK : ERROR;
/********** End **********/
}
status NextElem(SqList L,ElemType e,ElemType &next)
// 如果线性表L存在,获取线性表L元素e的后继,保存在next中,返回OK;如果没有后继,返回ERROR;如果线性表L不存在,返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
next = -1;
for (int i = 0; i < L.length; i++) {
if (L.elem[i] == e && i != L.length - 1) next = L.elem[i + 1];
}
return (next != -1) ? OK : ERROR;
/********** End **********/
}
status ListInsert(SqList &L,int i,ElemType e)
// 如果线性表L存在,将元素e插入到线性表L的第i个元素之前,返回OK;当插入位置不正确时,返回ERROR;如果线性表L不存在,返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
if (i < 1 | i > L.length + 1) return ERROR;
if (L.length + 1 > L.listsize) {
L.listsize += LISTINCREMENT;
L.elem = (ElemType *)realloc(L.elem, L.listsize * sizeof(ElemType));
}
for (int j = L.length - 1; j >= i - 1; j--) L.elem[j + 1] = L.elem[j];
L.elem[i - 1] = e;
L.length++;
return OK;
/********** End **********/
}
status ListDelete(SqList &L,int i,ElemType &e)
// 如果线性表L存在,删除线性表L的第i个元素,并保存在e中,返回OK;当删除位置不正确时,返回ERROR;如果线性表L不存在,返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
if (i < 1 | i > L.length) return ERROR;
e = L.elem[i - 1];
for (int j = i - 1; j < L.length - 1; j++) L.elem[j] = L.elem[j + 1];
L.length--;
return OK;
/********** End **********/
}
status ListTraverse(SqList L)
// 如果线性表L存在,依次显示线性表中的元素,每个元素间空一格,返回OK;如果线性表L不存在,返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
if (L.length == 0) return OK;
for (int i = 0; i < L.length - 1; i++) {
printf("%d ", L.elem[i]);
}
printf("%d", L.elem[L.length - 1]);
return OK;
/********** End **********/
}
status SaveList(SqList L,char FileName[])
// 如果线性表L存在,将线性表L的的元素写到FileName文件中,返回OK,否则返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem == NULL) return INFEASIBLE;
FILE *fp;
fp = fopen(FileName, "w");
for (int i = 0; i < L.length; i++) {
fprintf(fp, "%d ", L.elem[i]);
}
fclose(fp);
return OK;
/********** End **********/
}
status LoadList(SqList &L,char FileName[])
// 如果线性表L不存在,将FileName文件中的数据读入到线性表L中,返回OK,否则返回INFEASIBLE。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (L.elem != NULL) return INFEASIBLE;
FILE *fp;
fp = fopen(FileName, "r");
L.listsize = 100;
L.elem = (ElemType *)malloc(L.listsize * sizeof(ElemType));
L.length = 0;
while (fscanf(fp, "%d", L.elem + L.length) != -1) {
L.length++;
}
fclose(fp);
return OK;
/********** End **********/
}
status AddList(LISTS &Lists,char ListName[])
// 只需要在Lists中增加一个名称为ListName的空线性表,线性表数据又后台测试程序插入。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
Lists.elem[Lists.length].L.elem = NULL;
InitList(Lists.elem[Lists.length].L);
int i = 0;
for (i = 0; ListName[i] != 0; i++) {
Lists.elem[Lists.length].name[i] = ListName[i];
}
Lists.length++;
/********** End **********/
}
status RemoveList(LISTS &Lists,char ListName[])
// Lists中删除一个名称为ListName的线性表
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int pos = -1;
for (int i = 0; i < Lists.length; i++) {
int flag = 0;
for (int j = 0; ListName[j]; j++) {
if (ListName[j] == Lists.elem[i].name[j]) continue;
flag = 1;
}
if (!flag) {
pos = i;
break;
}
}
if (pos == -1) return ERROR;
for (int i = pos; i < Lists.length - 1; i++) {
int p = 0;
for (p = 0; ListName[p] != 0; p++) {
Lists.elem[i].name[p] = Lists.elem[i + 1].name[p];
}
Lists.elem[i].L.elem = Lists.elem[i + 1].L.elem;
Lists.elem[i].L.length = Lists.elem[i + 1].L.length;
Lists.elem[i].L.listsize = Lists.elem[i + 1].L.listsize;
}
Lists.length--;
return OK;
/********** End **********/
}
int LocateList(LISTS Lists,char ListName[])
// 在Lists中查找一个名称为ListName的线性表,成功返回逻辑序号,否则返回0
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int pos = -1;
for (int i = 0; i < Lists.length; i++) {
int flag = 0;
for (int j = 0; ListName[j]; j++) {
if (ListName[j] == Lists.elem[i].name[j]) continue;
flag = 1;
}
if (!flag) {
pos = i;
break;
}
}
if (pos != -1) return pos + 1;
return 0;
/********** End **********/
}