列表

详情


NC211231. F、天选子

描述

某高校,上体育喜欢玩一个游戏。现在一共有N个同学,每个同学手上有一张纸条,纸条上分别写着是1-N的数字,现在这N个同学按照纸条上的数字进行升序排序,且他们是排在同一行的。下面是游戏规则:

从头开始一至二报数,凡是报到二的出列,剩下的向小序号方向靠拢,同样保持升序,再从头开始一至三报数,凡是报到三的出列,剩下的向小序号方向靠拢,同样保持升序,接下来继续从头开始一至二报数,凡是报到二的出列,剩下的向小序号方向靠拢,同样保持升序,再从头开始一至三报数,凡是报到三的出列,剩下的向小序号方向靠拢,同样保持升序……如此循环,一直报数,直到剩下的人数不超过三人为止。当然剩下的同学依旧向小序号方向靠拢,同样保持升序。

然后将剩下不超过三名同学的编号相加得到一个数,若是大于M则输出这不超过三名同学各自的编号。否则输出M和这不超过三名同学编号之和的绝对值。

输入描述

只有一行,由N(0<N<5001)和M组成

输出描述

只有一行,若是大于M则输出队列还剩下的同学各自的编号,由一个空格隔开。否则输出M和这剩下同学编号之和的差的绝对值

示例1

输入:

20 9

输出:

1 7 19

说明:

输出:
最后队列中还剩编号为1、7、19的同学,他们的编号加起来和为27,大于9,即为大于M,因此输出1、7、9

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

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);
}

上一题