问题标题: 酷町堂:3888

0
0
已解决
胡钰妍
胡钰妍
资深光能
资深光能

#include<bits/stdc++.h>

using namespace std;

struct dp

{

int flag;

int num;

};

dp a[1005];

int main()

{

int m,n;

cin>>m>>n;

int t=0,w=1;

for(int i=1;i<=n;i++)

{

t=t+w;

a[t].flag=1;

a[t].num++;

w++;

if(t>m)

t=t-m;

}

int fl=1;

for(int i=1;i<=m;i++)

{

if(a[i].flag==0)

{

fl=0;

cout<<i<<" ";

}

}

if(fl!=0)

{

int max1=-1;

for(int i=1;i<=m;i++)

{

if(a[i].num>max1)

max1=i;

}

cout<<max1<<endl;

}

return 0;

}

超时


0
已采纳
张帆
张帆
中级天翼
中级天翼

你这种方法太复杂,下面这种思路20行就能搞定:

定义m,n,输入m,n
定义一个a数组,记录每个灯泡被按下多少次,存储在灯泡编号-1的位置
定义一个指针变量d,初值为m-1
循环n次
每次d=(d+i)%m;	
遍历每个灯泡,发现为0(a数组),直接输出i+1

then:
Accepted:100分

 

张帆在2020-11-03 19:03:02追加了内容

你这个代码超时了只能把cin改成scanf优化,按我讲的思路来就对了,我也看不懂你在写啥

PS:建议发问题的时候用“插入代码段”发代码

张帆在2020-11-03 19:13:03追加了内容
if(t>m)

t=t-m;

你在这里有考虑过t>m*2吗?

应改为

while(t>m) t=t-m

 

张帆在2020-11-03 19:15:21追加了内容

超时的话,按数据来说应该不会超时,不然你就把cin改成scanf,cout改成printf

0
李显晨
李显晨
中级启示者
中级启示者
布尔 flag;
    定义 n,m;
    输入>>n>>m;
    循环(int i=1;i<=m;i++) {
        定义 t=(t+i)%n;
        a[t]++;
    }
    循环(int i=1;i<=n-1;i++)
        如果(a[i]==0) {
            输出<<i<<" ";
            flag=1;
        }
    如果(a[0]==0)
        cout<<n;

数组自己定义

0
蔡乐毅
蔡乐毅
高级光能
高级光能

你还是按张帆的思路来吧!

我也是这么写的!

0
0
0
0
胡钰妍
胡钰妍
资深光能
资深光能

顶,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

我要回答