CCF_2016_09_2_火车购票

题目难度不大,只是提醒自己数组的初始化方式,尽量标准一点,否则,不同编译器之间,这种错误很难发现。

  • 在函数外部定义的内置类型的数组,最常用的int被默认地初始化为0;
  • 在函数内部定义的内置类型数组,默认初始值是未指定的;
  • int 类型数组列表初始化时,提供的初始值数量小于数组维度时,剩下的元素被初始化为默认值0;

自已在函数 外部int a[20][6]={0};自己测试没错,提交之后总是0分。最后发现就是这种初始化方式的问题。
引用C++primer的话就是。

默认初始化:

如果定义变量时没有指定初始值,变量被默认初始化,并被赋予默认值。
默认值由变量类型决定,同时,变量的位置也会对默认值有影响。
对于数组的列表初始化,书中写的好像有些模糊和vector联系到了一起。

#include<iostream>
#include<queue>
using namespace std;
int findN(int(*a)[6],int nums) {//查找是否有可以提供连座的行;
	for (int i = 0; i < 20; ++i) {
		if (a[i][0] >= nums) {
			return i;
		}
	}
	return -1;
}
void getAns(int(*a)[6],int nums,queue<int>&q) {
		int x = findN(a,nums);
		if (x == -1) {//如果不存在,就进行
			int hadfind = 0;
			for (int ii = 0; ii < 20; ++ii) {
				int jj = 1;
				for (; jj < 6; ++jj) {
					if (a[ii][jj] == 0) {
						a[ii][jj] = 1;
						q.push(ii*5+jj);
						++hadfind;
					}
					if (hadfind == nums) {
						a[ii][0] = 5 - jj;
						return;
					}
				}
				a[ii][0] = 0;
			}
		}
		else {
			int k = 1;
			while (a[x][k] ==1) {
				++k;
			}
			int endi = k+nums;
			for (; k < endi;++k ) {
				q.push(x*5+k);
				a[x][k] = 1;
			}
			a[x][0] -= nums;
		}
}
void input() {
	queue<int> q[100];
	int a[20][6] = {0};//a[i][0]显示当前行可用座位树;a[i][1]->a[i][5]表示对应座位;
	int n;
	cin >> n;
	for (int i = 0; i < 20; ++i) {
		a[i][0] = 5;
	}
	int x = 0;
	for (int i = 0; i <n; ++i) {
		cin >> x;
		getAns(a,x,q[i]);
	}
	for (int i = 0; i < n; ++i) {//输出结果;
		while (!q[i].empty()) {
			cout << q[i].front() << " ";
			q[i].pop();
		}
		cout << endl;
	}	
}
如有不当,欢迎指正 :)
原文地址:https://www.cnblogs.com/lif323/p/7460773.html