首页 > 其他分享 >洛谷 P1094纪念品分组 题解

洛谷 P1094纪念品分组 题解

时间:2023-01-25 11:34:23浏览次数:64  
标签:纪念品 洛谷 int 题解 P1094 分组

一道典型的贪心算法题。


题目内容不多说了,大致说一下代码的思路:

给定的所有纪念品中可以先用sort排一下顺序,然后从价格最高和最低的开始向中间靠拢(可以看做是指针),这样保证每组的搭配都是最优的。


看代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int w,n,a[100010],b[100010],cnt;
 4 int main(){
 5     cin>>w>>n;
 6     for(int i=1;i<=n;i++){
 7         cin>>a[i];
 8         b[i]=a[i];
 9     }//设置一个b数组后面用于判断此纪念品是否已被分组 
10     sort(a+1,a+n+1);//排序 
11     int k=n,m=1;//用k记录剩余未分组的纪念品数量 
12     while(k){
13         if(b[n]!=0){//这个纪念品还未被分组 
14             int sum=a[n];//从最大的开始    
15             b[n]=0;//该纪念品已被分组 
16             k--;//数量减1
17             for(int i=m;i<n;i++){//最多查找到当前选定的价格最高的纪念品 
18                 if(a[i]+sum<=w){//没有超出限制金额 
19                     sum+=a[i]; //累计纪念品价格 
20                     b[i]=0;
21                     k--;
22                     m++;//下次从这个往上找 
23                     continue;
24                 }
25                 else{
26                     cnt++;
27                     break;
28                 }
29             }
30             if(k==0){
31                 cnt++;
32                 break;
33             } 
34             //如果没有可以找的了,cnt+1,结束循环,防止上面的循环找到最后没有纪念品        
35         }
36         n--;//下一次从比这次小得开始。 
37     }
38     cout<<cnt;
39     return 0;
40 }

 

标签:纪念品,洛谷,int,题解,P1094,分组
From: https://www.cnblogs.com/zhangqixun/p/17066775.html

相关文章

  • 洛谷 P2440木材加工 题解
    这是一道二分答案算法题,洛谷标签中的贪心等完全用不到。这道题的数据范围较大,所以保险起见,整型的数据我们都开成longlong题意很好理解,这里就不做过多的分析了,直接看代码......
  • 洛谷P1259 黑白棋子的移动 题解
    本蒟蒻这题用的打表做法,其实也可以理解为是一种递推。先来观察一下样例:当n为7时,输出共有14行,易得输出行数为2n。ooooooo*******--oooooo--******o*oooooo******--o......
  • LeetCode-670. 最大交换-题解分析
    题目来源670.最大交换题目详情给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。示例1:输入:2736输出:7236解释:交换数字2和数字......
  • 题解 ARC154D【A + B > C ?】
    显然\(1+1>x\)对任意大于\(1\)的正整数\(x\)都不成立。利用这一点,我们可以在\(n-1\)次询问内问出\(1\)的位置。具体地,首先假设\(p_1\)为\(1\),记我们假设的为......
  • 莫比乌斯函数(P3455 题解)
    题目链接。我们定义\(n\)的莫比乌斯函数为\(\mu_n\)。我们将\(n\)分解质因式后为\(n=p_1^{\alpha_1}p_2^{\alpha_2}\cdotsp_k^{\alpha_k}\)则\(\mu_n=\begin......
  • CF1726D 题解
    EdgeSplit。一开始nt了,以为红边为一颗树,蓝边为剩余边,蓝边就不会有环了。假设有\(n\)个点,\(m\)条边,且这些边没有出现环,那么连通块的数量为\(n-m\),因为不存在环,......
  • AT_abc285_e 题解
    WorkorRest。我们考虑相邻两个假期之间的工作效率和。设\(len\)为相邻两个假期间隔的天数。举个例子,如果假期为\(\{1,3,7\}\),那么\(len\)为\(\{1,4\}\)。根......
  • CF1768C 题解
    \(\mathcalSolution\)【题意】题目要你构造两个序列\(p,q\),满足\(\max\{p_i,q_i\}=a_i\)。【分析】如果满足\(\max\{p_i,q_i\}=a_i\),则满足\(p_i=a_i,q_i\le......
  • CF1768D 题解
    \(\mathcalSolution\)【题意】我们可以交换任意两个数,求最小操作几次能让逆序对变成\(1\)。【分析】如果逆序对为\(1\)的排列一定是:\(2,1,\cdotsn\)\(1,3,......
  • ABC281E 题解
    \(\mathcalSolution\)本题的思路类似于对顶堆。用两个multiset来维护。\(S_1\)为第一个multiset;\(S_2\)为第二个multiset。\(S_1\)维护前\(K\)个值,\(S_2\)......