题目
给一个正整数数列 nums,一个跳数 jump,及幸存数量 left。
运算过程为:从索引0的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1 的数字,该数被敲出,并从该点起跳,以此类推,直到幸存 left 个数为止,然后返回幸存数之和。
约束:
- 0是第一个起跳点
- 起跳点和命中点之间间隔 jump 个数字,已被敲出的数字不计入在内。
- 跳到末尾时无缝从头开始(循环查找),并可以多次循环。
- 若起始时 left > len(nums) 则无需跳数处理过程。
方法设计:
/** * @param nums 正整数数列,长度范围 [1, 10000] * @param jump 跳数,范围 [1, 10000] * @param left 幸存数量,范围 [0, 10000] * @return 幸存数之和 */ int SumToLeft(vector<int>& nums, int jump, int left)
题目输入
第一行输入正整数数列
第二行输入跳数
第三行输入幸存数量
题目输出
输出幸存数之和
实例
输入 | 1,2,3,4,5,6,7,8,9 4 3 |
输出 | 13 |
说明 | 从1(索引为0)开始起跳,中间跳过 4 个数字,因此依次删除 6,2,8,5,4,7。剩余1,3,9,返回和为13 |
题目解析
题目
题目代码
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
// 约瑟夫环
int SumToLeft(vector<int>& nums, int jump, int left){
int now = 1;
while(nums.size() > left){
now += jump;
now %= nums.size();
nums.erase(nums.begin() + now);
}
int result = 0;
for(auto nu:nums) result += nu;
return result;
}
int main(){
string str;
cin >> str;
istringstream iss(str);
vector<int> nums;
string numStr;//这一块一定是string
while(getline(iss, numStr, ',')){
nums.push_back(stoi(numStr));
}
int jump, left;
cin >> jump >> left;
int result = SumToLeft(nums, jump, left);
cout << result << endl;
return 0;
}