1.
如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串。例如: "1","10101","0101010"都是交错01串。
2. 小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,n个学生在列队的时候,小易老师正好去卫生间了。学生们终于有机会反击了,于是学生们决定来一次疯狂的队列,他们定义一个队列的疯狂值为每对相邻排列学生身高差的绝对值总和。由于按照身高顺序排列的队列的疯狂值是最小的,他们当然决定按照疯狂值最大的顺序来进行列队。现在给出n个学生的身高,请计算出这些学生列队的最大可能的疯狂值。小易老师回来一定会气得半死。
小易现在有一个01串s,小易想找出一个最长的连续子串,并且这个子串是一个交错01串。小易需要你帮帮忙求出最长的这样的子串的长度是多少
思路:定义两个数组,d[i],f[i]分别为i位置以1和0结尾的字符长度。根据第一个字符来初始化d[0]和f[0],然后遍历数组,当遇见1时,f[i] = 0,d[i] = f[i-1] + 1;同理,遇见0时,d[i] = 0,f[i] = d[i-1] + 1;最后找出d,f数组中的最大值就行了,也可以一边遍历一边找出来。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
string s;
cin>>s;
int len = s.size();
int d[len], f[len]; //d-1, f-0
for(int i = 0; i < len; i++) d[i] = 0,f[i] = 0;
if(s[0]== '1') {
d[0] = 1;
} else {
f[0] = 1;
}
for(int i = 1; i < len; i++ ) {
if(s[i] == '1') {
f[i] = 0;
d[i] = f[i-1]+1;
} else {
d[i] = 0;
f[i] = d[i-1]+1;
}
}
int maxre = 1;
for(int i = 0; i < len; i++) {
maxre = max(max(d[i],f[i]),maxre);
}
cout<<maxre;
return 0;
}
2. 小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,n个学生在列队的时候,小易老师正好去卫生间了。学生们终于有机会反击了,于是学生们决定来一次疯狂的队列,他们定义一个队列的疯狂值为每对相邻排列学生身高差的绝对值总和。由于按照身高顺序排列的队列的疯狂值是最小的,他们当然决定按照疯狂值最大的顺序来进行列队。现在给出n个学生的身高,请计算出这些学生列队的最大可能的疯狂值。小易老师回来一定会气得半死。
思路:先排序,放最大的下去,最小的两个放两边,一直重复,最后只有一个的时候要判断一下放哪儿,最后一个case脑子是瓦特了吗?这都没整明白,只到90%。没想到这种情况。又没有case可以调。
//case 则如1 1 1 1 1 1 1 500 500 500 500 1000 1000 1000 1000就会出错,因为按照顺序来就错啦,所以最后一个需要进行判断
自己的代码,最后一个没改。别人正确的代码下面,就不改了。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin>>n;
vector<int> re;
int a = n;
while(a--) {
int b;
cin>>b;
re.push_back(b);
}
int count = 0;
sort(re.begin(),re.end());
if(n == 1) {
cout<<0;
return 0;
}
if(n == 2) {
cout<<abs(re[1]-re[0]);
return 0;
}
if(n >= 3){
int t = n,min1 = min(re[0],re[1]),min2= re[1]+re[0]-min