题干里说:路灯的编号从1开始 但是,当我从1开始编号输出时,我的输出答案总是比标准答案大1。
#include<stdio.h>
int main()
{
int n;//定义轮数
scanf("%d",&n);
double a[n];
long t[n],max=0;//定义一个max,表示这所有n轮操作所涉及到的最大编号,免得浪费内存(萌新理解)
for(int i=0;i<n;i++)
{
scanf("%lf %ld",&a[i],&t[i]);
if(max<((long)(a[i]*t[i])))
max=((long)(a[i]*t[i]));//遍历获取最大编号
}
int lit[max]={0};//定义路灯数组,0表示关,1表示开
for(int i=0;i<n;i++)
{
for(long j=1;j<=t[i];j++)
lit[(long)(a[i]*j)]=1-lit[(long)(a[i]*j)];//用强制转换定位,开关路灯
}
for(long i=0;i<max;i++)
{
if(lit[i])//若编号为i的路灯是开着的
{
printf("%ld",i+1);
return 0;
}
}
}
可知,测试机默认是从0开始给路灯编号; 于是,我直接输出数组的角标,反而对了。。。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
double a[n];
long t[n],max=0;
for(int i=0;i<n;i++)
{
scanf("%lf %ld",&a[i],&t[i]);
if(max<((long)(a[i]*t[i])))
max=((long)(a[i]*t[i]));
}
int lit[max]={0};
for(int i=0;i<n;i++)
{
for(long j=1;j<=t[i];j++)
lit[(long)(a[i]*j)]=1-lit[(long)(a[i]*j)];
}
for(long i=0;i<max;i++)
{
if(lit[i])
{
printf("%ld",i);//就只是在这里把“+1”删掉后,全部AC
return 0;
}
}
}
(所以这是因为题干与测试机的数据不匹配导致的吗?) (萌新想@管理员,奈何不会。。。大佬们帮忙@一下好吗。。。希望洛谷越来越好)