题目比较基础
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 }