算法入门例题8-1

题目
翻煎饼问题,一开始前几天做过,用了两个数组一个来计数一个开比较,其实真的没必要,若是真的想要完全可以用struct定义一个结构体,然后然他另外一个参数为他的开始的下标这样你就可以追踪了。
当时算到最后改了大半天才发现原来他就是每一次翻动之后你又想要再用一次原来的方法有的从来一遍两个数组这个可不是一个好的递归过程,学长建议在打代码之前做题应该手动模拟几个数据先然后进行比较,可以保证起码5个步骤以上的是正确的在进行计算,比如cf上有个jump第k步可以跳k次,或者-1,最后你会找到规律,找最大的,然后以及这个步骤之内的其他新结果。
未知长度的数组可以用字符串,还有EOF end pf file 的使用,以及判断类型的type.h
对整行的输入
这样子应当用循环来找出他们的变化,则对于复杂对于只至少为n的4次方
其实后来在做一遍又想了个方法,就是只管每一次选的坐标,然后就是不管其他的在进行排序,睡觉时又想了一下,其实这个这个属于自嗨形还是不对,然后想了结构体的两个一个坐标,一个数据,双重排序,然后他就是可以做的了。睡觉时想到的。
但是还有就是他排序之后的转换完坐标还有在进行一次以坐标进行排序,因为此时的最大值的下标不是最大的下次一还要被选出来,所以还要在选择一次``

int main()
{
    string line:
    while(getline(cin,line))
    cout<<line<<endl;
    return 0;
}
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<sstream>
using namespace std;
struct A {
	int a;
	int order;
/*	bool operator >(A b)
	{

		return a > b.a;
	}*/
}c[35];

bool cmp1(A a, A b) {
	return a.a > b.a;
}
bool cmp2(A a, A b) {
	return a.order < b.order;
}
int main() {
	int  i,g;
	int x;
	string s;
	while (getline(cin, s)) {
		cout << s << "\n";
		stringstream ss(s);//把空格都给赋值进去了,要修改。
		i = 0;
		while (ss >> x)
		{		
	       c[i].a = x;
			c[i].order = i++;//注意设置-1时的变化可能是后面就要用等于号
		}
		break;
		}
	g = i;

	for (int j = 0; j <g;j++)
	{
		sort(c, c + g - j,cmp1);
		for (int i = 0; i < g; i++)
			cout << c[i].a << " " << c[i].order << endl;
		cout << endl;
		if (c[0].order == g - 1 -j)
		{
			sort(c, c + g - j, cmp2);
			continue;
		}
		else if (c[0].order == 0)
		{
		//	cout << j + 1 << " ";
			sort(c,c + g - j, cmp2);//返回原型,
			for (int k = 0; k < g - j; k++)
				c[k].order =g - k - j-1;
			sort(c, c + g - j, cmp2);
		}
		else
		{
		//cout <<c[0].order+1<< " " <<j+1<< " ";
		int temp = c[0].order;
		sort(c, c + g - j,cmp2);
		for (int k = 0; k < g - j; k++)
			if (c[k].order <= temp)
			{
				c[k].order =temp-c[k].order;
				c[k].order = g - j - 1 - c[k].order;
			}
			else
				c[k].order = g - j-1-c[k].order;
		sort(c, c + g - j, cmp2);
		}
		for (int i = 0; i < g; i++)
			cout << c[i].a << " " << c[i].order << endl;
		cout << endl;

	}
	return 0;


}

这个验证了一下对于一行的式子来说还是可以的,比如说算法入门里面的但是对于这个题可能就有些缺陷了,还有一个就是题面的样例太特殊,仅用到前面两种判断,一开始错误在第三个判断语句的执行体里面,这个就需要用其他案例了。还有何必要用合并式子没有能力,可以分成两个式子啊。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值