c语言煎饼问题算法,翻煎饼问题(示例代码)

输入

输入包括两行,第一行是一个整数n(1<=n<=1000),表示煎饼的个数,接下来的一行有n个不相同的整数,整数间用空格隔开,每个整数表示煎饼的大小(直径),左边表示顶部,右边表示底部。

输出为一行,翻煎饼的最少次数

解:因为是用铲子翻煎饼,所以每翻一次,煎饼内部的顺序都会发生变化,这是需要注意的。如果这个煎饼的位置是在最上方,那么只需要翻一次煎饼就好了,把它翻到最上面去,如果煎饼的位置是在中间的话,那么我们要先把它翻到上面去,然后再翻一次,把它翻到最下面去,根据这个思路的话,我们应该有两个函数,第一个就是要找到最大的煎饼的位置,第二个就是要把煎饼翻转。

因此代码为

#include

using namespace std;

int findMax(int a[], int n)

{

int max = 0,i;

for (i = 1; i < n; i++)

{

if (a[i]>a[max])

{

max = i;

}

}

return max;

}

void turnover(int a[], int k)

{

int *p = a, *q = a + k - 1;

while (p < q)

{

int t = *p;

*p = *q;

*q = t;

p++;

q--;

}

}

int main()

{

int n, i,sum=0,max=0;

cin >> n;

int *a = new int[n];//这里括号中一定要写入N不然要报CE错误,要不然就直接去掉括号和N

for (i = 0; i < n; i++)

{

cin >> a[i];

}

while (n>0)

{

max = findMax(a, n);

if (max != n - 1)

{

sum += (max == 0 ? 1 : 2);

turnover(a, max + 1);

turnover(a, n);

}

n--;

}

cout << sum << endl;

return 0;

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值