ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

深信服笔试 3.24

2020-03-24 21:56:19  阅读:261  来源: 互联网

标签:numVec tmpNum return int 笔试 信服 while 3.24 tmpIndex


题目比较基础

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 }

 

标签:numVec,tmpNum,return,int,笔试,信服,while,3.24,tmpIndex
来源: https://www.cnblogs.com/codewars/p/12562315.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有