NC211231. F、天选子
描述
某高校,上体育喜欢玩一个游戏。现在一共有N个同学,每个同学手上有一张纸条,纸条上分别写着是1-N的数字,现在这N个同学按照纸条上的数字进行升序排序,且他们是排在同一行的。下面是游戏规则:
从头开始一至二报数,凡是报到二的出列,剩下的向小序号方向靠拢,同样保持升序,再从头开始一至三报数,凡是报到三的出列,剩下的向小序号方向靠拢,同样保持升序,接下来继续从头开始一至二报数,凡是报到二的出列,剩下的向小序号方向靠拢,同样保持升序,再从头开始一至三报数,凡是报到三的出列,剩下的向小序号方向靠拢,同样保持升序……如此循环,一直报数,直到剩下的人数不超过三人为止。当然剩下的同学依旧向小序号方向靠拢,同样保持升序。
然后将剩下不超过三名同学的编号相加得到一个数,若是大于M则输出这不超过三名同学各自的编号。否则输出M和这不超过三名同学编号之和的绝对值。
输入描述
只有一行,由N(0<N<5001)和M组成
输出描述
只有一行,若是大于M则输出队列还剩下的同学各自的编号,由一个空格隔开。否则输出M和这剩下同学编号之和的差的绝对值
示例1
输入:
20 9
输出:
1 7 19
说明:
C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 380K, 提交时间: 2020-08-24 17:18:51
#include<bits/stdc++.h> using namespace std; int n,m,cnt=2,sum; int main() { cin>>n>>m; vector<int> v; for(int i=1;i<=n;i++) v.push_back(i); while(v.size()>3){ vector<int> tmp; for(int i=0;i<v.size();i++) if((i+1)%cnt!=0) tmp.push_back(v[i]); cnt=5-cnt; v=tmp; } for(int i=0;i<v.size();i++) sum+=v[i]; if(m<sum) for(int i=0;i<v.size();i++){ cout<<v[i]<<" "; } else cout<<abs(m-sum)<<endl; }
C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 408K, 提交时间: 2023-03-27 20:32:57
#include <iostream> using namespace std; //moni int s[5005]; int main(){ int n,m,i,j,k,t,sum=0; cin>>n>>m; for(i=1;i<=n;i++) s[i]=i; for(k=1;n>3;k++){ if(k%2)t=2; else t=3; for(i=1,j=0;i<=n;i++) if(i%t) s[++j]=s[i]; n=j; } for(i=1;i<=n;i++) sum+=s[i]; if(sum>m) for(i=1;i<=n;i++) cout<<s[i]<<" "; else cout<<abs(sum-m); }