问题描述
试题编号: | 201609-2 |
试题名称: | 火车购票 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。 输入格式 输入的第一行包含一个整数n,表示购票指令的数量。 输出格式 输出n行,每行对应一条指令的处理结果。 样例输入 4 样例输出 1 2 样例说明 1) 购2张票,得到座位1、2。 评测用例规模与约定 对于所有评测用例,1 ≤ n ≤ 100,所有购票数量之和不超过100。 |
模拟题,只有90/100,错误
代码如下:
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <cstring>//memset
#include <string>
using namespace std;
int visited[110];
void solve(int m){
if(m == 1){
for(int i = 1;i <= 100;i++)
if(!visited[i])
{
visited[i] = 1;
cout<<i<<endl;
return ;
}
}
int tmpm = m;
int flagm = 0;//用于判断是否可以输出连续的数
int k;
for(k = 1;k <= 100;k++){
if(visited[k])continue;
int flag = 1;//用于下一个循环,判读那当前k是否合法
for(int i = 0;i <= tmpm-1;i++)
{
if(i+k>100||visited[i+k]||(i<tmpm-1&&(i+k)%5 ==0)){flag = 0;break;
}
}
if(flag == 0)continue;//不合法,下一个
for(int i = 0;i < tmpm;i++)
{
cout<<i+k<<" ";
visited[i+k] = 1;
flagm = 0;
}
if(flagm == 0){//下面的else语句实际上是永远不会执行的
cout<<endl;
return;
}
else{//问题出在这里--没有正确处理好连续和不连续之间的转换关系
//事实上,无法连续输出的话,这里也不会输出不连续的票号
int tmpmm = tmpm;
for(int j = 1;j <= 100;j++){
if(tmpmm==0){cout<<endl;return;
}
if(visited[j])continue;
cout<<j<<" ";
visited[j] = 1;
tmpmm--;
}
}
}
}
int main(){
int n;
cin>>n;
memset(visited,0,sizeof(visited));
for(int i = 0;i < n;i++)
{
int tmp;
cin>>tmp;
solve(tmp);
}
return 0;
}
再次梳理一下思路:
票的编号是1-100,可以不用数组存储
标记数组,买过票的记为1,没买的记为0,初始值为全0
思路,买一张票时,找到最小的即可
买m张票(两张、三张、四张、五张)时,先找连续的2、3、4、5,找到了输出,找不到的话,再重头开始找,找m张(2、3、4、5张)输出
找到连续的,怎么找,枚举当前的数i,i加一个数(从0到m-1),得到新的数j,对于票j,如果已经卖出去了,或者已经越界超过100了,或者导致不在一排(只要加的那个数比m-1小,只要j%5不等于0即可),说明当前的i不合法,找下一个i。注意换行符的输出。
找不到连续的,从头遍历,只要是没有卖的票,输出m张即可。注意换行符的输出。
90/100代码错误原因如下:没有处理好连续和不连续之间的转换关系
下面的代码是100/100的正确输出
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <cstring>//memset
#include <string>
using namespace std;
int visited[110];
void solve(int m){
if(m == 1){
for(int i = 1;i <= 100;i++)
if(!visited[i])
{
visited[i] = 1;
cout<<i<<endl;
return ;
}
}
int tmpm = m;
int flagm = 0;//用于判断是否可以输出连续的数
int k;
//可以连续输出
for(k = 1;k <= 100;k++){
if(visited[k])continue;
int flag = 1;//用于下一个循环,判读那当前k是否合法
for(int i = 0;i <= tmpm-1;i++)
{
if(i+k>100||visited[i+k]||(i<tmpm-1&&(i+k)%5 ==0)){flag = 0;break;
}
}
if(flag == 0)continue;//不合法,下一个
for(int i = 0;i < tmpm;i++)
{
cout<<i+k<<" ";
visited[i+k] = 1;
}
cout<<endl;
return;
}
//无法连续输出
if(k==101){
int tmpmm = tmpm;
for(int j = 1;j <= 100;j++){
if(tmpmm==0){cout<<endl;return;
}
if(visited[j])continue;
cout<<j<<" ";
visited[j] = 1;
tmpmm--;
}
}
}
int main(){
int n;
cin>>n;
memset(visited,0,sizeof(visited));
for(int i = 0;i < n;i++)
{
int tmp;
cin>>tmp;
solve(tmp);
}
return 0;
}
ccf支持<bits/stdc++.h>
模拟题,注重理清思路,就是模拟,要正确表达出分类对应的代码