找出总分最高的学生

关于指针(找出总分最高的学生)

有些小细节不太会处理,在下面标注一下。

scanf("%s %s %d %d %d", s[i].num, s[i].name, &s[i].a, &s[i].b, &s[i].c);

p = &s[i];

printf("%s %s %d\n", p->name, p->num, max);

#include <math.h>
#include <stdio.h>
typedef struct stuent {
    char num[6];
    char name[12];
    int a, b, c;
} stu;
int main(void) {
    stu s[12];
    stu* p = NULL;
    int n;
    scanf("%d", &n);
    int sum = 0, max = 0;
    for (int i = 0; i < n; i++) {
        sum = 0;
   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        scanf("%s %s %d %d %d", s[i].num, s[i].name, &s[i].a, &s[i].b, &s[i].c);
        sum = s[i].a + s[i].b + s[i].c;
        if (sum > max) {
            max = sum;
            p = &s[i];//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        }
    
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    printf("%s %s %d\n", p->name, p->num, max);
    return 0;
}

汉诺(hanoi)塔问题(递归)

讲解视频(bilibili)

讲解文章(csdn)

没看懂

#include<stdio.h>
void print(char start,char end)
{
	printf("%c-->%c\n",start,end);
	return;
}
void hanoi(int n,char start,char temp,char end)
{
	if(n==1)
	{
		print(start,end);
	}else
	{
		hanoi(n-1,start,end,temp);
		print(start,end);
		hanoi(n-1,temp,start,end);
	}
	return ;
}
int main(void)
{
	int n;
	scanf("%d",&n);
	hanoi(n,'a','b','c');
	return 0;
}

九连环问题(递归)

文章讲解(csdn)

不要去想明白每个步骤,理解抽象即可,比如要上第n个环,则要先上前n-1个环,再拿下来前n-2个环,把第n个环放上去,接下来该上第n-2个环。

#include <stdio.h>

void RingUp(int number);
void RingDn(int number);

int main()
{
    int n;
    char p;
    scanf("%d %c", &n, &p);
    switch (p)
    {
    case 'U':
        RingUp(n);
        break;
    case 'D':
        RingDn(n);
        break;
    }
    return 0;
}

void RingUp(int number)
{
	if(number>2)
	{
		RingUp(number-1);
		RingDn(number-2);
		printf("%d: U\n",n);
		RingUp(number-2);
	}else if(number==2)
	{
		printf("%d: U\n",n-1);
		printf("%d: U\n",n);
	}else if(number==1)
	{
		printf("%d: U\n",n);
	}
	return ;
}
void RingDn(int number)
{
	if(number>2)
	{
		RingDn(number-2);
		printf("%d: D\n",n);
		RingUp(number-2);
		RingDn(n-1);
	}else if(number==2)
	{
		printf("%d: D\n",n);
		printf("%d: D\n",n-1);
	}else if(number==1)
	{
		printf("%d: D\n",n);
	}
	return;
}

哈希表提高时间效率

(问的ChatGPT)

修改哈希函数

alt

修改哈希表大小

alt

void rehash(void) {
    int newSize = HASH * 2; // 扩大 2 倍
    hashnode **newTable = (hashnode **)calloc(newSize, sizeof(hashnode *));
    
    for (int i = 0; i < HASH; i++) {
        hashnode *node = hashtable[i];
        while (node) {
            hashnode *next = node->next;
            int newIndex = fhash(node->key) % newSize;
            node->next = newTable[newIndex];
            newTable[newIndex] = node;
            node = next;
        }
    }
    free(hashtable);
    hashtable = newTable;
    HASH = newSize;
}

搭积木最少步骤

P1969 [NOIP2013 提高组] 积木大赛

alt

alt

#include <stdio.h>
int main(void)
{
    int n;
    scanf("%d", &n);
    int a[100005] = {0};
    int cnt = 0;
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
        if (i != 0 && a[i] > a[i - 1])
            cnt += (a[i] - a[i - 1]);

        if (i == 0)
            cnt += a[i];
    }
    printf("%d\n", cnt);
    return 0;
}

快速幂

快速幂都能做什么?小小的算法也有大大的梦想

看这个视频讲的很清楚