深信服笔试 3.24
题目比较基础
1.水桶叠放
输入:水桶数目 和 水桶容量
输出:从下向上加水,求溢出了多少水?
思路:最大连续子序列的思路有点像。
1 int main(){ 2 while(cin >> N >> X){ 3 int tmpNum, tmpAdd; 4 stack<int> tmpStack; 5 while(N--){ 6 cin >> tmpNum >> tmpAdd; 7 tmpStack.push(tmpNum + tmpAdd); 8 } 9 int sum = 0, last = 0; 10 while(!tmpStack.empty()){ 11 tmpNum = tmpStack.top(); 12 tmpStack.pop(); 13 tmpNum -= X; 14 last += tmpNum; 15 if(last > 0){ 16 sum += last; 17 last = 0; 18 } 19 } 20 cout << sum << endl; 21 } 22 return 0; 23 }
2.排队循环报数,为M的倍数或个位数是M则出队
输入:人数N, 数M(0 < M < 9)
输出:队中剩余的最后一个人的下标
思路:直接模拟
1 bool flagIsTrue(int n){ 2 if(n % M == 0 || n % 10 == M) 3 return true; 4 return false; 5 } 6 int main(){ 7 while(cin >> N >> M){ 8 vector<bool> flagVec(N+1, false); 9 int num = 1, index = 0, cnt = N; 10 while(cnt > 1){ 11 if(!flagVec[++index]){ 12 if(flagIsTrue(num)){ 13 flagVec[index] = true; 14 cnt--; 15 } 16 num++; 17 } 18 if(index == N) 19 index = 0; 20 } 21 for(int i = 1; i <= N; ++i) 22 if(!flagVec[i]) 23 cout << i << endl; 24 } 25 return 0; 26 }
3.N个红宝石,1个蓝宝石,现给出所有宝石的价格(都是整数),商人A买个M个红宝石,商人B买个N-M个红宝石,且A买的宝石的价格之和是B买的宝石的价格之和 的2倍。
输入:N+1个宝石的价格(蓝宝石的价格是其中一个) , 商人A购买的红宝石个数M
输出:蓝宝石价格的下标,若给出的价格中没有可以作为蓝宝石的价格,输出NO;若有多个价格可能是蓝宝石的价格,则输出下标最小的
思路:回溯递归
1 int N, M; 2 int blueNum, blueCnt; 3 vector<int> numVec; 4 vector<int> flagVec; 5 bool isRight(int n, int tmpIndex){ 6 if(n == 0) 7 return true; 8 if(n < numVec[tmpIndex] || tmpIndex > N) 9 return false; 10 if(blueNum == numVec[tmpIndex] && (blueCnt-- > 0)) 11 return isRight(n, tmpIndex + 1); 12 return isRight(n, tmpIndex + 1) || isRight(n-numVec[tmpIndex], tmpIndex + 1); 13 } 14 int main(){ 15 while(cin >> N >> M){ 16 numVec.resize(N+1); 17 flagVec.resize(N+1, false); 18 int sum = 0, tmpNum, dstIndex = -1; 19 for(int i = 0; i <= N; ++ i){ 20 cin >> tmpNum; 21 sum += tmpNum; 22 numVec[i] += tmpNum; 23 } 24 vector<int> tmpNumVec = numVec; 25 sort(numVec.begin(), numVec.end()); 26 for(int i = 0; i <= N; ++ i){ 27 if((sum - tmpNumVec[i]) % 3 == 0){ 28 blueNum = tmpNumVec[i]; 29 blueCnt = 1; 30 if(isRight((sum - tmpNumVec[i])/3, 0)){ 31 dstIndex = tmpNumVec[i]; 32 break; 33 } 34 } 35 } 36 dstIndex >= 0 ? cout << dstIndex << endl : cout << "NO" << endl; 37 } 38 return 0; 39 }