深信服笔试 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 }

复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值