节约用电
题目链接
https://nanti.jisuanke.com/t/T1742
思路
我觉得这道题是有问题的,题目统计了位置相同的灯,但是答案错了,因为请看给的“标程”。
解释写在里面了。
”标程“
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++) {
scanf("%d",&a[i]);
}
sort(a,a+n);
int ans=0;
int last=a[0];
for (int i=1;i<n-1;i++) {
printf("%d\n",a[i+1]-last);
if (a[i+1]-last<=m) {//错误写法,为什么从1开始还跳过了下标为1的灯呢
ans++;
}
else {
last=a[i];
}
}
printf("%d\n",ans);
return 0;
}
这里给出我的解法
下面那组数据的答案应该是10
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int a[maxn];
int main()
{
// freopen("in.txt","r",stdin);
int n,m,loc,last=-1;
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++) {
scanf("%d",&loc);
a[loc]++;
last=max(last,loc);
}
int pre=0;
while (!a[pre]) {
pre++;
}
for (int i=0;i<=last;i++) {
if (a[i])
printf("%d ",i);
}
// printf("i: %d\n",pre);
int ans=0,i=pre;
while (i<last) {
printf("beg: %d\n",i);
int r=i+m-1;
i++;
while (i<last&&i<=r) {
if (a[i]) {
ans+=a[i];
printf("i a[i] %d %d\n",i,a[i]);
a[i]=0;
}
i++;
}
printf("end: %d\n\n",i);
// printf("ans %d\n",ans);
while (i<last&&!a[i]) {
i++;
}
}
printf("%d\n",ans);
return 0;
}
/*
7 2
1 2 3 4 4 4 4
8 12 14 15 19 38 39 47 53 69 75 86 100
*/