201609-1 最大波动
问题描述
小明正在利用股票的波动程度来研究股票。小明拿到了一只股票每天收盘时的价格,他想知道,这只股票连续几天的最大波动值是多少,即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少。
输入格式
输入的第一行包含了一个整数n,表示小明拿到的收盘价格的连续天数。
第二行包含n个正整数,依次表示每天的收盘价格。
输出格式
输出一个整数,表示这只股票这n天中的最大波动值。
样例输入
6
2 5 5 7 3 5
样例输出
4
知识点:求绝对值
#include <iostream>
#include <cmath>
using namespace std;
int main(int argc, char** argv) {
int n;
cin>>n;
int a[n];
int max=0;
int temp;
for(int i=0;i<n;i++){
cin>>a[i];
if(i>0){
temp=abs(a[i]-a[i-1]);
if(temp>max) max=temp;
}
}
cout<<max;
return 0;
}
201609-2 火车购票
问题描述
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。
购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。
输入格式
输入的第一行包含一个整数n,表示购票指令的数量。
第二行包含n个整数,每个整数p在1到5之间,表示要购入的票数,相邻的两个数之间使用一个空格分隔。
输出格式
输出n行,每行对应一条指令的处理结果。
对于购票指令p,输出p张车票的编号,按从小到大排序。
样例输入
4
2 5 4 2
样例输出
1 2
6 7 8 9 10
11 12 13 14
3 4
考虑的点有点多,一排内相邻,不可以就输出编号小的
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int main(){
int n;
cin>>n;
// 购票数量
int num;
// 当前可满足购票数量
int count;
// 0表示这个座位没有被购买
int a[21][6]={0};
int j,k;
// 是否找到满足条件的座位
bool flag;
for(int i=0;i<n;i++){
cin>>num;
flag=false;
for(j=0;j<20;j++){
count=0;
for(k=1;k<=5;k++){
// 只有没购买且
// 不是5的倍数或者最后一张票是5的倍数才可以++(限制一排内)
if(a[j][k]==0&&(k%5!=0||num-count==1)){
count++;
}else{
count=0;
}
// 数量达到跳出循环
if(count==num) {
flag=true;
break;
}
}
if(flag) break;
}
// 能够同一排相邻座位找到遍历输出
if(flag){
for(int m=k-num+1;m<=k;m++){
cout<<5*j+m<<" ";
a[j][m]=1;
}
}else{ // 不能在一排
count=0;
for(j=0;j<20;j++){
for(k=1;k<=5;k++){
if(a[j][k]==0){
cout<<5*j+k<<" ";
a[j][k]=1;
count++;
}
if(count==num) break;
}
if(count==num) break;
}
}
cout<<endl;
}
return 0;
}