2807: 【基础】分披萨
时间限制: 1 Sec 内存限制: 128 MB
提交: 1137 解决: 367
[提交] [状态] [讨论版] [命题人:ghost79]
题目描述
Michael请N个朋友吃馅饼,但是每个朋友吃且仅吃一个馅饼的1/4、1/2或3/4。请你编程求出Michael至少需要买多少个馅饼。注意一个人只愿意吃来自同一块馅饼的一部分,而不愿意吃来自不同馅饼的若干小块。例如有个朋友要吃3/4块馅饼,Michael就只能从一个馅饼上切下3/4给他吃,而不能从一个馅饼上切一半,再从另一个馅饼上切1/4给他。
输入
输入数据的第一行是整数N,1≤N≤10000;
接下来的N行,每行都是1/4、1/2或3/4。
输出
输出数据仅有一行包含一个整数——Michael至少需要购买的馅饼数目。
样例输入
6
3/4
1/2
3/4
1/2
1/4
1/2
样例输出
4
提示
样例中的4个馅饼是这样安排的,第1个朋友和第5个朋友合吃1个馅饼,第3个朋友单独吃1个馅饼,第2个朋友和第4个朋友合吃1个馅饼,第6个朋友单独吃1个馅饼,共计需要4个馅饼。
武进区第9届程序设计比赛题(小学)
题解如下
#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp_sort(int a,int b)
{
return a>b;
}
int main()
{
int n;
// const int part=4;
scanf("%d",&n);
char ar[n][3];
int br[n]; //转换并存储对应ar[n]的值
for(int i=0;i<n;i++)
{
scanf("%s",ar[i]);
if(ar[i][2]=='2')
br[i]=ar[i][0]-'0'+1;
else
br[i]=ar[i][0]-'0';
}
sort(br,br+n,cmp_sort);
int sum_piece=0;
int count_3=0;
for(int i=0;i<n;i++)
{
if(br[i]==3)
{
count_3++;
sum_piece++;
br[i]=-1; //设置假值
}
}
for(int i=n-1;i>=0;i--)
{
if(br[i]==1)
{
count_3--;
br[i]=-1; //设置改元素为加值
}
if(count_3==0)
{
break;
}
}
//printf("%d\n\n",sum_piece);
for(int i=0;i<n;i++)
{
if(br[i]!=-1)
{
sum_piece++;
for(int j=i+1;j<n;j++)
{
if(br[j]!=-1)
{
if(br[i]==2)
{
if(br[j]==2)
{
br[i]=-1;
br[j]=-1;
}
else if(br[j]==1)
{
br[i]=-1;
br[j]=-1;
int surplus_part=2;
for(int l=j+1;l<n;l++)
{
if(br[l]==1)
{
br[l]=-1;
surplus_part--;
}
if(surplus_part==0)
{
break;
}
}
}
}
else if(br[i]==1)
{
br[i]=-1;
br[j]=-1;
int surplus_part=3;
for(int l=j+1;l<n;l++)
{
if(br[l]==1)
{
br[l]=-1;
surplus_part--;
}
if(surplus_part==0)
{
break;
}
}
}
// for(int i=0;i<n;i++)
{
// printf("%d ",br[i]);
}
}
}
}
}
printf("%d",sum_piece);
return 0;
}