题目
翻煎饼问题,一开始前几天做过,用了两个数组一个来计数一个开比较,其实真的没必要,若是真的想要完全可以用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;
}
这个验证了一下对于一行的式子来说还是可以的,比如说算法入门里面的但是对于这个题可能就有些缺陷了,还有一个就是题面的样例太特殊,仅用到前面两种判断,一开始错误在第三个判断语句的执行体里面,这个就需要用其他案例了。还有何必要用合并式子没有能力,可以分成两个式子啊。