网易有道笔试
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网易有道笔试相关的知识,希望对你有一定的参考价值。
题目:
输入
输入中有多组测试数据。每组测试数据的第一行包含两个整数n和k(1 =< n =< 1000, 1=< k =< 99),表示购票请求数量和影院大小。第二行为空格分隔的n个整数mi,mi表示每次要求购买的票数(1<=mi <= k)。
输出
对每组测试数据输出n行,每个购买请求的结果为一行。如果无法在一行中买到mi个连续的座位,则在对应的行中输出-1。否则输出三个空格分隔的整数x, yl, yr,为所买电影票的排号和起止位置。
样例输入
2 1
1 1
4 3
1 2 3 1
样例输出
1 1 1
-1
2 2 2
1 1 2
3 1 3
2 1 1
#include <iostream> #include <vector> using namespace std; //计算该位置到中心的距离 int distanceToCenter(int x, int y, int xc, int yc) { int xdis = x>xc ? x - xc : xc - x; int ydis = y>yc ? y - yc : yc - y; return xdis + ydis; } int main() { int n, k; while (1){ //1、 cin >> n >> k; int xc = k / 2, yc = xc; int i = 0; int* a = new int[k*k];//值为0表示空座,为1表示已经被选 for (i = 0; i<k*k; ++i){ a[i] = 0; } //2、 i = 0; vector<int> v; int tmp = 0; while (i<n){ cin >> tmp; v.push_back(tmp); ++i; } //3、 for (i = 0; i<v.size(); ++i){//i个请求结果,每个请求的票数一次保存在v中 int retdis = 0x7fffffff; vector<int> vret; int tmp = v[i]; int row = 0; for (int j = 0; j<k; ++j){//j表示行 for (int m = 0; m<k; ++m){//m表示列 tmp = v[i]; while (m<k+1 - v[i] && a[j*k + m] == 1) ++m; if (m >= k+1 - v[i]){ break; } //判断有无v[i]个空的座位 int sumdis = 0; int th = 0; while (tmp--){ if (a[j*k + m + th] == 0){ sumdis += distanceToCenter(j, m + th, xc, yc); ++th; } else break; } if (tmp != -1){//没有足够的空座位 sumdis = 0; } else{//有足够的空位 if (sumdis<retdis){ retdis = sumdis; vret.clear(); for (int t = 0; t < th;++t){ vret.push_back(m + t); row = j; } } } tmp = vret.size(); } } if (vret.size() != 0){ for (int h = 0; h < tmp; ++h){ a[row*k+vret[h]] = 1; } cout << row + 1 << " " << vret[0] + 1 << " " << vret[vret.size() - 1] + 1 << endl; vret.clear(); } else{ cout << "-1" << endl; } } delete[] a; } return 0; }
代码有多层循环,变量什么时候清零,什么时候赋值还是需要细心的,
我只测试了部分输入输出,代码中一定还有BUG,我会尽量减少BUG的
本文出自 “零蛋蛋” 博客,谢绝转载!
以上是关于网易有道笔试的主要内容,如果未能解决你的问题,请参考以下文章