[ CodeVS冲杯之路 ] P2456

本文提供了一道名为“不充钱,你怎么AC?”的编程题的两种解题思路:一种是使用贪心算法,通过排序和逐个匹配木板与木材来尽可能减少剩余材料;另一种是采用深度优先搜索(DFS)的方法,通过递归尝试不同的组合,以确定最多可以完成多少个木板。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  不充钱,你怎么AC?

  题目:http://codevs.cn/problem/2456/

 

  用贪心的思想,木材当然要尽量分成多的木板,而大的木材能够分成大木板,但是小的木材不一定能够分成大的木板,所以木板和木材都是从小到大开始选,然后要保证剩余的木材最少

  那么将木板和木材排序,对于每个木材,把能够分的小木板尽量分掉,如果遇到更大的木板则把最小的木板腾出来,然后在加上,这样保证剩余的木材最少

  因为是上午写得这道题,思路可能不连贯了,代码应该描述的很清楚

  虽然贪心在CodeVS上可以过,但是它是有数据可以卡掉的,而正解是DFS

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 
 9 const int N=51,M=1024;
10 int a[N],b[M],next[M];
11 bool f[M];
12 int main()
13 {
14     int n,i,j,m,k,now,ans=0,x,y;
15     scanf("%d",&n);
16     for (i=1;i<=n;i++) scanf("%d",&a[i]);
17     sort(a+1,a+1+n);
18     scanf("%d",&m);
19     for (i=1;i<=m;i++) scanf("%d",&b[i]);
20     sort(b+1,b+1+m);
21     for (i=1;i<=n;i++)
22         {
23             now=a[i];
24             for (j=0;j<=m;j++) next[j]=0;
25             for (j=1;j<=m;j++)
26                 {
27                     if (f[j]) continue;
28                     if (now>=b[j])
29                         {
30                             now-=b[j];
31                             f[j]=1;
32                             ans++;
33                             next[j]=next[0];
34                             next[0]=j;
35                         }
36                     else
37                         {
38                             k=x=0;
39                             while (now+b[next[k]]>=b[j]) k=next[x=k];
40                             if (k)
41                                 {
42                                     next[x]=next[k];
43                                     f[k]=0;
44                                     f[j]=1;
45                                     next[j]=next[0];
46                                     next[0]=j;
47                                     now+=b[k]-b[j];
48                                 }
49                         }
50                 }
51         }
52     printf("%d\n",ans);
53     return 0;
54 }

 

  下面是DFS的正解,贴的别人的代码

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 
 9 #define N 1100
10 
11 int n,m;
12 int sum1,ans;
13 int tim,res;
14 
15 int a[N],b[N],c[N],sum[N];
16 
17 int work(int x,int k)
18 {
19     if (!x)
20         return true;
21     if (tim>res)
22         return false;
23     for (int i=k;i<=n;i++)
24         if (a[i]>=b[x])
25         {
26             a[i]-=b[x];
27             if (a[i]<b[1])
28                 tim+=a[i];
29             if (b[x]==b[x-1])
30             {
31                 if (work(x-1,i))
32                     return true;
33             }
34             else if (work(x-1,1))
35                 return true;
36             if (a[i]<b[1])
37                 tim-=a[i];
38             a[i]+=b[x];
39         }
40     return false;
41 }
42 
43 int main()
44 {
45     scanf("%d",&n);
46     for (int i=1;i<=n;i++)
47         scanf("%d",&a[i]),sum1+=a[i],c[i]=a[i];
48     scanf("%d",&m);
49     for (int i=1;i<=m;i++)
50         scanf("%d",&b[i]);
51     sort(a+1,a+n+1);
52     sort(b+1,b+m+1);
53     for (int i=1;i<=m;i++)
54         sum[i]=b[i]+sum[i-1];
55     int l=0,r=m;
56     while (l!=r)
57     {
58         int mid=(l+r+1)>>1;
59         tim=0;
60         res=sum1-sum[mid];
61         if (work(mid,1))
62             l=mid;
63         else
64             r=mid-1;
65         for (int i=1;i<=n;i++)
66             a[i]=c[i];
67     }
68     printf("%d\n",l);
69     return 0;
70 }

 

转载于:https://www.cnblogs.com/hadilo/p/5924546.html

基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值