Forever Young

OI复健计划

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 **********/
}
posted @ 2023-03-22 20:59  Loceaner  阅读(128)  评论(5编辑  收藏  举报