【题解】PIZZA 贪心

题目描述

Michael请N个朋友吃馅饼,但是每个朋友吃且仅吃一个馅饼的1/4、1/2或3/4。请你编程求出Michael至少需要买多少个馅饼。

输入输出格式

输入格式:

输入文件的第一行是整数N;接下来的N行中,每行都是1/4、1/2或3/4。

输出格式:

输出文件仅有一行包含一个整数——至少需要购买的馅饼数目。

输入输出样例

输入样例#1: 复制

6
3/4
1/2
3/4
1/2
1/4
1/2

输出样例#1: 复制

4

说明

1 ≤ N ≤ 10,000

思路

  • 简单贪心但要注意细节讨论

贪心:

  • 考虑到3/4块的要么与1/4的配对成一块,要么单独作为一块;

    • 同时与1/2,1/4相比更容易使代价增加(即期望更大),所以要优先处理3/4
      之后我分情况讨论了一下
  • 若一开始1/4的就比3/4的少,
    • 那么处理完第一步后,1/4已经被消耗完.只可能剩下1/2与3/4大小的.
    • 对于1/2块的考虑与自己配对
    • 最后加上没能配对的1/2和第一步后剩下的3/4
  • 若刚开始时1/4比3/4多
    • 第一步后只剩下了1/4与1/2大小的
    • 先考虑两个1/4与一个1/2组成一队
    • 在分别与自己配对
    • 最后根据情况得到ans

代码

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register int
using namespace std;
inline int read(){
    int x=0,w=1;
    char ch=getchar();
    while(ch!=‘-‘&&(ch<‘0‘||ch>‘9‘)) ch=getchar();
    if(ch==‘-‘) w=-1,ch=getchar();
    while(ch>=‘0‘&&ch<=‘9‘) x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    return x*w;
}
int sum_1,sum_2,sum_3,ans=0;
char s[5];
int main(){
    freopen("T21330.in","r",stdin);
    int n;
    n=read();
    for(re i=1;i<=n;++i) {
        scanf("%s",s);
        if(s[0]==‘1‘&&s[2]==‘4‘) sum_1++;
        if(s[0]==‘1‘&&s[2]==‘2‘) sum_2++;
        if(s[0]==‘3‘&&s[2]==‘4‘) sum_3++;
    }
    int ans=0;
    if(sum_1>sum_3) {
        ans+=sum_3;
        sum_1-=sum_3;
        sum_3=0;
    }else {
        ans+=sum_1;
        sum_3-=sum_1;
        sum_1=0;
    }
    if(sum_1==0) {
        ans=ans+(sum_2/2)+(sum_2%2)+sum_3;
        printf("%d\n",ans);
        return 0;
    } else {
        while(sum_1>=2&&sum_2>=1) {
            ans++;
            sum_1-=2;
            sum_2-=1;
        }
        ans+=sum_1/4+sum_2/2;
        sum_1%=4;
        sum_2%=2;
        if((sum_1==0||sum_1==1)&&(sum_2!=0)) {printf("%d\n",ans+1);return 0;}
        if(sum_1!=0&&sum_2==0) {printf("%d\n",ans+1);return 0;}
        //ans=ans+sum_2;
        //printf("%d\n",ans);
        return 0;
    }

}

c++

?

原文地址:https://www.cnblogs.com/bbqub/p/8482789.html

时间: 2024-10-29 03:41:29

【题解】PIZZA 贪心的相关文章

luoguP1080 国王游戏 题解(NOIP2012)(贪心+高精)

luoguP1080 国王游戏 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define il inline #define rg register #define ll long long #define N 10001 #define inf 10000

luoguP1084 疫情控制(题解)(搜索+贪心)

luoguP1084 疫情控制 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define il inline #define rg register #define ll long long #define N 60000 #define inf 21474

[题解+总结]20151012贪心

1.前言 NOIP前互测题第一弹——来自hcy的贪心专题.因为我考试前一天晚上手贱(真的算手贱吗)去BZOJ上刷题然后碰巧那道题就是今天的考试题,结果碰巧又被hcy注意到了...其实本来我无意去知道的..结果就这样莫名其妙地A了.贪心什么的感觉还好,另外一道题以前做过,对于“三分”这个概念我印象还很深. 2.Lawnmower 割草机 大概题意:在n*m的0-1矩形中,从左上角(0,0)出发,每次只能朝两个方向移动——下,左或右.若当前行i为2的余数则向右,否则向右.求用最短路经过所有1的点.

vijos1741 观光公交 (贪心)

https://www.vijos.org/p/1741 P1741观光公交 请登录后递交 标签:NOIP提高组2011[显示标签] 描述 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游客越来越多,Y市特意安 排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0分钟出现在1号景点,随后依次前往2.3.4……n号景点.从第i号景点开到第i+1 号景点需要Di分钟.任意时刻,公交车只能往前开,或在景点处等待. 设共有m个游客,每位游客需要乘车1次从一个景点到达另一个景点,第i位

URAL 2019 Pair: normal and paranormal (贪心) -GDUT联合第七场

比赛题目链接 题意:有n个人每人拿着一把枪想要杀死n个怪兽,大写字母代表人,小写字母代表怪兽.A只能杀死a,B只能杀死b,如题目中的图所示,枪的弹道不能交叉.人和怪兽的编号分别是1到n,问是否存在能全部杀死的情况,如果存在则输出编号1到n的每个人杀死的怪兽的编号,如果不能输出"Impossible". 题解:贪心,用递归实现,判断相邻的是否能构成一对,优先构成相邻的,如果不能就递归到前面看是否能构成一对即可. #include<cstdio> #include<cst

HDU 3183 贪心

A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3019    Accepted Submission(s): 1172 Problem Description Kiki likes traveling. One day she finds a magic lamp, unfortunately the geni

Codeforces Round #276 (Div. 1)D.Kindergarten DP贪心

D. Kindergarten In a kindergarten, the children are being divided into groups. The teacher put the children in a line and associated each child with his or her integer charisma value. Each child should go to exactly one group. Each group should be a

uoj #31. 【UR #2】猪猪侠再战括号序列 贪心

#31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Description 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其是括号序列理论,一度令我沉浸其中,无法自拔.至于OI算法竞赛,我年轻时确有参加,虽仅获一枚铜牌,但我素性淡泊,毫不在意,毕竟那所谓FFT.仙人掌之类

codeforce Gym 100685E Epic Fail of a Genie(贪心)

题意:给出一堆元素,求一个子集,使子集的乘积最大,如有多个,应该使子集元素个数尽量小. 题解:贪心,如果有乘积大于1的正数,那么是一定要选的,注意负数也可能凑出大于1的正数,那么将绝对值大于1的负数两两配对,如果还剩下一个,那么在判断一下,那个负数和比它小的最小负数的乘积是否大于1,如果是那么就选这两个.把所有可能凑成大于1的数选完以后,剩下的数一定比1小,那么就不选. 如果无法凑出大于1的数,那么再分类讨论一下. 挺容易写错... #include<bits/stdc++.h> using