网易秋招c++研发工程师9.8题解
编程题:第一题简单不写了;格式终于调好了
第二题:
给定一个N*M的矩阵,在矩阵中每一块有一块牌子,假定刚开始的时候所有牌面向上。 现在对于每个块进行如下操作: >翻转某个块中的牌子,并且与之相邻的其余八张牌也会翻转; XXX XXX XXX 如上矩阵所示,翻转中间那块时,这九块都翻转一次。请输出在对矩阵中每一块进行如上操作后,牌面向下的个数。 输入描述: 第一行为测试用例数t,(1<=t<=100000) 接下来t行,每行2个整数N,M(1<=N,M<=1,000,000,000) 输出牌面向下的块的个数。 示例: 输入: 5 1 1 1 2 3 1 4 1 2 2 输出: 1 0 1 2 0
第三题:
香槟塔:很高的香槟塔,A发出两种指令,指令1是向X层倒入体积V的香槟,
指令2是询问第k层香槟体积为多少 输入描述:
第一行为n,m表示香槟塔的总层数和指令数。
第二行为n个整数a,表示每层香槟塔的容量。
第三行到第2+m行有两种输入,一种是“1 k”表示询问第k层当前有多少香槟
另一种是“2 x y”表示往x层倒入体积v的香槟。
1<=n,m<=200000;1<=a,v<=1000000000.
示例:
输入:
1 2
8
2 1 9
1 1
输出:
8
示例:
输入:
5 4
1 2 2 10 1
1 3
2 2 5
2 4 3
1 4
输出:
0
4
第二题 #include <bits/stdc++.h> using namespace std; int main(){ int num; long long N, M; cin >> num; while (num--) { cin >> N >> M; if (N == 1) M < 2 ? cout << 1 << endl : cout << M - 2 << endl; else if (M == 1) N < 2 ? cout << 1 << endl : cout << N - 2 << endl; else cout << N*M - 2 * M - 2 * N + 4 << endl; } return 0; }
第三题 #include <bits/stdc++.h> using namespace std; int main(){ int n, m; while (cin >> n >> m) { vector<long long> v; vector<long long> vtemp; long long v0; while (n--) { cin >> v0; v.push_back(v0); vtemp.push_back(0); } int flag; while (m--) { cin >> flag; if (flag == 1) { cin >> flag; cout << vtemp[flag - 1] << endl; } else if (flag == 2) { int x; long long y; cin >> x >> y; while (y) { if (v[x - 1] > vtemp[x - 1]) { if (y > v[x - 1] - vtemp[x - 1])//倒冒了 { y -= (v[x - 1] - vtemp[x - 1]); vtemp[x - 1] = v[x - 1]; x == vtemp.size() ? y = 0 : x++; } else { vtemp[x - 1] += y; y = 0; } } else if (v[x - 1] == vtemp[x - 1])//这层满了 x == vtemp.size() ? y = 0 : x++; } } } } return 0; }