题目描述
### 题目描述:
koala设计了一个程序,首先他写了一个暴力算法,但是在他写完之后受到电脑病毒的影响而失忆。好在他的源代码和题面数据范围保留了下来(数据范围在输入描述中已经给出),但是现在仍然无法通过这个题目。由于电脑病毒的影响,题面已经消失,现在他希望你基于源代码做出优化来解决这道题。
C++代码:
```C++
#include
using namespace std;
// 链表结构体定义
typedef struct node {
int id;
struct node *next;
} *pNode, Node;
// 循环链表头节点
pNode head;
// 按顺序删除的前n-1个节点的id构成的列表
vector ans;
int main() {
// n个节点,判断值k
int n, k;
cin >> n >> k;
// 构造包含n个节点的循环链表
head = (pNode)malloc(sizeof(Node));
pNode now = head;
for (int i = 1; i <= n; ++i) { pNode a = (pNode)malloc(sizeof(Node)); a->id = i;
now->next = a;
now = now->next;
}
now->next = head->next;
// pc为计数器
int pc = 0;
now = head;
// 当前节点的上一个节点
pNode last = nullptr;
// 程序执行到链表只剩下最后一个节点为止
while (n > 1) {
pc++;
last = now;
now = now->next;
// 当计数器pc = k时从循环链表中删除当前节点,并把被删除的节点的id添加到答案列表ans中
if (pc == k) {
last->next = now->next;
n--;
pc = 0;
ans.push_back(now->id);
}
}
// 输出最终答案
for (auto id : ans) {
cout << id << ' '; } return 0; } ``` ## 格式 ### 输入格式: $ n, k (2 \le n \le 3 * 10^5 , 1 \le k \le 3 * 10^5) $ ### 输出格式: 根据题意输出答案 ## 样例 1 ### 输入: ``` 10 3 ``` ### 输出: ``` 3 6 9 2 7 1 8 5 10 ```
输入样例 复制
10 3
输出样例 复制
3 6 9 2 7 1 8 5 10