启航预备役每日总结19

博客记录了每日学习进展。一是解决“补充书架”算法题,采用动态规划,用 dp[i]表示放前 i 本书的最小高度,通过递推公式求解;二是完善数据结构项目图书馆系统,编写图书借阅、归还及查看借阅信息函数,但文件改动出现乱码待解决。

1.每日一题

补充书架

https://leetcode.cn/problems/filling-bookcase-shelves/description/

思路与算法:

根据题意,按顺序将这些书摆放到总宽度为 shelfWidth的书架上。先选几本书放在书架上,然后再建一层书架。重复这个过程,直到把所有的书都放在书架上。考虑用动态规划来解决这个问题,dp[i]来表示放下前 i本书所用的最小高度。 因为最多 1000本书, 每本书高度最大 1000,我们可以把 dp[i]初始化为 1000000, 初始化 dp[0] 为零,表示没有书是高度为零。

当我们要放置前 i本书时候,假定前 j本书放在上面的书架上,其中 j<i, 前 j本书放好后剩余的书放在最后一层书架上, 这一层书架的高度是这部分书的高度最大值,由此得到如此递推公式:dp[i]=min⁡(dp[j]+max⁡(books[k]))其中满足0≤j≤k<i≤n,∑books[k]≤shelfWidth我们循环遍历 i, 求出 dp[i]的值,最后返回 dp[n]为最终答案。

代码如下:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int main()
{
	vector<vector<int>>books{ {1,1},{2,3},{2,3},{1,1},{1,1},{1,1},{1,2} };//可以自己更改
	int shelfWidth;
	cin >> shelfWidth;
	int n = books.size();
	vector<int> dp(n + 1, 1000000);
	dp[0] = 0;
	for (int i = 0; i < n; ++i) 
	{
		int maxHeight = 0, curWidth = 0;
		for (int j = i; j >= 0; --j) 
		{
			curWidth += books[j][0];
			if (curWidth > shelfWidth) 
			{
				break;
			}
			maxHeight = max(maxHeight, books[j][1]);
			dp[i + 1] = min(dp[i + 1], dp[j] + maxHeight);
		}
	}
	cout << dp[n] << endl;
	return 0;
}

 2.每日学习

继续完善了数据结构的项目图书馆里系统

编写完善了图书的借阅和归还

代码如下:

void jie_name(struct LNode *L, struct UNode *U)
{
    FILE *fp,*fq;
    char name[200];
    char c;
    int flag = 0;
    printf("请输入你要借阅的图书名称,如果要退出则输入“exit”:");
    while (1)
    {
        scanf("%s", name);
        if (!strcmp(name, "exit"))
        {
            printf("按任意键退出..........\n");
            getch();
            return;
        }
        struct book *p;
        p = L->next;
        int found = 0; // 用于标记是否找到匹配的书名
        while (p != NULL)
        {
            if (!strcmp(name, p->name))
            {
                if (p->Borrow == 1)
                {
                    printf("该书已经被借出!\n");
                    found = 1;
                    break;
                }
                else
                {
                    printf("\t\t书号:%d\n\t\t书名:%s\n\t\t出版社:%s\n\t\t出版日期:%d年%d月%d日\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day);
                    printf("\t是否确认借阅此书(‘Y’或者‘N’)");
                    getchar();
                    scanf("%c", &c);
                    if (c == 'Y')
                    {
                        p->Borrow = 1;
                        printf("借阅成功!\n");
                        found = 1;
                        struct user *q;
                        q = U->next;
                        while (q != NULL)
                        {
                            if (!strcmp(q->username, user_zhanghao) && !strcmp(q->userpassword, user_mima))
                            {
                                int i;
                                for (i = 0; i < 3; i++)
                                {
                                    if (q->num[i] == 0)
                                    {
                                        q->num[i] = p->num;
                                        break;
                                    }
                                }
                            }
                            q = q->next;
                        }
                    }
                    else
                    {
                        printf("已经取消操作,按任意键继续查找下一本书...\n");
                        getch();
                    }
                }
            }
            p = p->next;
        }
        if (found == 0)
        {
            system("cls");
            printf("图书系统没有记录该书名的书或者该书已经被借阅!按任意键返回..........");
            return;
        }
        else
        {
            fp = fopen("book.txt", "w");
            struct book *p;
            p = L->next;
            while (p != NULL)
            {
                fprintf(fp, "%d %s %s %d %d %d %d\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day, p->Borrow);
                p = p->next;
            }
            fclose(fp);
            fq=fopen("user.txt","w");
            struct user *q;
            q = U->next;
            while (q != NULL)
            {
                fprintf(fq, "%s %s %d %d %d\n", q->username, q->userpassword, q->num[0], q->num[1],q->num[2]);
                q = q->next;
            }
            fclose(fq);
            printf("按任意键返回..........\n");
            getch();
            return;
            flag = 1;
        }
    }
    if (flag == 0)
    {
        printf("操作取消,按任意键退出...\n");
        getch();
        return;
    }
}

void jie_author(struct LNode *L, struct UNode *U)
{
    FILE *fp,*fq;
    char author[200];
    char c;
    int flag = 0;
    printf("请输入你要借阅的图书名称,如果要退出则输入“exit”:");
    while (1)
    {
        scanf("%s", author);
        if (!strcmp(author, "exit"))
        {
            printf("按任意键退出..........\n");
            getch();
            return;
        }
        struct book *p;
        p = L->next;
        int found = 0; // 用于标记是否找到匹配的书名
        while (p != NULL)
        {
            if (!strcmp(author, p->author))
            {
                if (p->Borrow == 1)
                {
                    printf("该书已经被借出!\n");
                    found = 1;
                    break;
                }
                else
                {
                    printf("\t\t书号:%d\n\t\t书名:%s\n\t\t出版社:%s\n\t\t出版日期:%d年%d月%d日\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day);
                    printf("\t是否确认借阅此书(‘Y’或者‘N’)");
                    getchar();
                    scanf("%c", &c);
                    if (c == 'Y')
                    {
                        p->Borrow = 1;
                        printf("借阅成功!\n");
                        found = 1;
                        struct user *q;
                        q = U->next;
                        while (q != NULL)
                        {
                            if (!strcmp(q->username, user_zhanghao) && !strcmp(q->userpassword, user_mima))
                            {
                                int i;
                                for (i = 0; i < 3; i++)
                                {
                                    if (q->num[i] == 0)
                                    {
                                        q->num[i] = p->num;
                                        break;
                                    }
                                }
                            }
                            q = q->next;
                        }
                    }
                    else
                    {
                        printf("已经取消操作,按任意键继续查找下一本书...\n");
                        getch();
                    }
                }
            }
            p = p->next;
        }
        if (found == 0)
        {
            system("cls");
            printf("图书系统没有记录该书名的书或者该书已经被借阅!按任意键返回..........");
            return;
        }
        else
        {
            fp = fopen("book.txt", "w");
            struct book *p;
            p = L->next;
            while (p != NULL)
            {
                fprintf(fp, "%d %s %s %d %d %d %d\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day, p->Borrow);
                p = p->next;
            }
            fclose(fp);
            fq=fopen("user.txt","w");
            struct user *q;
            q = U->next;
            while (q != NULL)
            {
                fprintf(fq, "%s %s %d %d %d\n", q->username, q->userpassword, q->num[0], q->num[1],q->num[2]);
                q = q->next;
            }
            fclose(fq);
            printf("按任意键返回..........\n");
            getch();
            return;
            flag = 1;
        }
    }
    if (flag == 0)
    {
        printf("操作取消,按任意键退出...\n");
        getch();
        return;
    }
}

void guihuan(struct LNode *L, struct UNode *U)
{
    system("cls");
    FILE *fp,*fq;
    int num;
    char c;
    printf("请输入你要归还的图书书号,如果要退出则输入'0':");
    while (1)
    {
        scanf("%d", &num);
        if (num==0)
        {
            printf("按任意键退出..........\n");
            getch();
            break;
        }
        struct book *p;
        p = L->next;
        int found = 0; // 用于标记是否找到匹配的书名
        while (p != NULL)
        {
            if (num==p->num)
            {
                if (p->Borrow == 0)
                {
                    printf("该书未被借阅!\n");
                    found = 1;
                    break;
                }
                else
                {
                    printf("\t\t书号:%d\n\t\t书名:%s\n\t\t出版社:%s\n\t\t出版日期:%d年%d月%d日\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day);
                    printf("\t是否确认借阅此书(‘Y’或者‘N’)");
                    getchar();
                    scanf("%c", &c);
                    if (c == 'Y')
                    {
                        struct user *q;
                        q = U->next;
                        while (q != NULL)
                        {
                            if (!strcmp(q->username, user_zhanghao) && !strcmp(q->userpassword, user_mima))
                            {
                                int i;
                                for (i = 0; i < 3; i++)
                                {
                                    if (q->num[i] == p->num)
                                    {
                                        p->Borrow = 0;
                                        printf("归还成功!\n");
                                        found = 1;
                                        q->num[i] = 0;
                                        break;
                                    }
                                }
                            }
                            q = q->next;
                        }
                        if(found==0)
                        {
                            printf("您未借阅此书!按任意键返回..........");
                            getch();
                            break;
                        }
                    }
                    else
                    {
                        printf("已经取消归还,按任意键返回..........\n");
                        getch();
                        break;
                    }
                }
            }
            p = p->next;
        }
        if (found == 0)
        {
            system("cls");
            printf("图书系统没有记录该书号的图书!按任意键返回..........");
            getch();
            break;
        }
        else
        {
            fp = fopen("book.txt", "w");
            struct book *p;
            p = L->next;
            while (p != NULL)
            {
                fprintf(fp, "%d %s %s %d %d %d %d\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day, p->Borrow);
                p = p->next;
            }
            fclose(fp);
            fq=fopen("user.txt","w");
            struct user *q;
            q = U->next;
            while (q != NULL)
            {
                fprintf(fq, "%s %s %d %d %d\n", q->username, q->userpassword, q->num[0], q->num[1],q->num[2]);
                q = q->next;
            }
            fclose(fq);
            printf("按任意键返回..........\n");
            getch();
            break;
        }
    }
}

编写了用户观看自己借阅了哪些图书的函数

代码如下:

void jieyuebook(struct LNode *L,struct UNode *U)
{
    system("cls");
    struct user *q;
    q = U->next;
    while (q != NULL)
    {
        if (!strcmp(q->username, user_zhanghao) && !strcmp(q->userpassword, user_mima))
        {
            printf("\t\t已借阅的图书信息:\n");
            int i;
            for (i = 0; i < 3; i++)
            {
                if (q->num[i] != 0)
                {
                    struct book *p;
                    p = L->next;
                    while (p != NULL)
                    {
                        if (p->num == q->num[i])
                        {
                            printf("\t\t书号:%d\n\t\t书名:%s\n\t\t出版社:%s\n\t\t出版日期:%d年%d月%d日\n\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day);
                            break;
                        }
                        p = p->next;
                    }
                }
            }
            break;
        }
        q = q->next;
    }
    printf("按任意键返回..........\n");
    getch();
}

文件在改动时会出现乱码的现象,不知道哪里出错,明天可以进行修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值