问题标题: 酷町堂:2973 切pizza 思路!!!

0
0
舒航
舒航
新手守护
新手守护

大佬你们好(我才学到队列,最近刷刷以前题目)!!!

2973   切pizza

题目描述 Description

到了发工资的日子,小明为了奖励自己一个月以来的辛苦工作,于是今天买了n块pizza,但是准备吃的时候同组的同事过来了,他答应给每个人留一口,然后量了量每个人口的大小。小明有把刀,可以切pizza,但他不能把两块pizza拼起来,但是他又不会给任何人两块pizza。现在问你,小明怎样切pizza,才能满足最多的人。(小明的刀很强,切的时候不会浪费pizza)。

输入描述 Input Description

第一行n,小明有n个pizza。接下来n行,每行表示一个pizza的大小。再一行一个数m,为同事的人数,然后m行,每行一个数,为一个人嘴的大小。(1<=n<=50, 1<=m<=1024)

输出描述 Output Description

一行,小明最多可以填多少张嘴巴。

样例输入 Sample Input

4
30
40
50
25
10
15
16
17
18
19
20
21
25
24
30

样例输出 Sample Output

7

数据范围及提示 Data Size & Hint

蛋糕大小和嘴巴大小均<=10000

 

本人不会以下是错误代码

#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
    return a>b;
}
int a[10010],b[10010],num;
int main()
{
    int n,m,j=1;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>b[i];
    }
    sort(a+1,a+n+1,cmp);
    sort(b+1,b+m+1);
    for(int i=1;i<=n;i++)
    {
        while(a[i]>=b[j])
        {
            a[i]-=b[j];
            num++;
            j++;
        }
    }
    cout<<num<<endl;
    return 0;
}

只得20分


0
潘晨皓
潘晨皓
高级天翼
高级天翼

@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!@舒航!!!!!

@舒航!!!!!@舒航!!!!!

里面有答案!!!!

0
0
0
0
0
0
王泽宇
王泽宇
初级光能
初级光能
  • cin>>n;
  • for(int i=1;i<=n;++i)
  • {
  • scanf("%d",&cake[i]);
  • tot+=cake[i];
  • }
  • cin>>m;
  • for(int i=1;i<=m;++i)
  • {
  • scanf("%d",&mouth[i]);
  • }
  • qsort(cake+1,n,sizeof(int),cmp);
  • qsort(mouth+1,m,sizeof(int),cmp);
  • sum[0]=0;
  • for(int i=1;i<=m;++i)sum[i]=sum[i-1]+mouth[i];
  • while(sum[m]>tot)--m;
  • int l=0,r=m;
  • while(l<=r)
  • {
  • mid=l+r>>1;
  • for(int i=1;i<=n;++i)fcake[i]=cake[i];
  • space=0;
  • if(dfs(mid,1))l=mid+1;
  • else r=mid-1;
  • }
  • cout<<l-1;
  • puts("");
  • 这是主函数
  • int cmp(const void *a, const void *b)
  • {
  • return(*(int *)a-*(int *)b);
  • }
  • bool dfs(int deep,int pos)
  • {
  • if(deep<=0)return 1;
  • if(tot-space<sum[mid])return 0;
  • for(int i=pos;i<=n;++i)
  • {
  • if(fcake[i]>=mouth[deep])
  • {
  • fcake[i]-=mouth[deep];
  • if(fcake[i]<mouth[1]) space+=fcake[i];
  • if(mouth[deep]==mouth[deep-1])
  • {
  • if(dfs(deep-1,i)) return 1;
  • }
  • else if(dfs(deep-1,1)) return 1;
  • if(fcake[i]<mouth[1]) space-=fcake[i];
  • fcake[i]+=mouth[deep];
  • }
  • }
  • return 0;
  • }
  • 其他函数
  • 定义自己写
0
0
0
0
0
0
0
0
我要回答