某超市有一种促销手段,购买金额超过一定阈值就随机给一个贴花。贴花有不同种类的,种类以编号表示,编号是一个1到100之间的数字。当收集到连续编号的三张贴花时,就可以换一个小礼物。
小明经常去某超市购物,积攒了不少贴花,你帮他看看,能换多少小礼物。
输入格式:
首先是一个正整数N(1<N<100),表示小明手上的贴花的数量。
然后是N个正整数Pi(1⩽Pi⩽1000,每个数字表示一张贴花的编号。
输出格式:
输出一个数字,表示小明可以换的小礼物的数量。如果不能换小礼物,就输出0
。
输入样例:
6
3 2 4 6 6 4
输出样例:
1
2 3 4是一个组合,之后剩下的4 6 6不是连续的编号
代码实现
#include<stdio.h>
int main()
{
int n,a[1001];
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(register int i=1;i<=n;i++)//排序,这里使用的是冒泡排序
{
for(register int j=i;j<=(n-1);j++)
{
if(a[j]>a[j+1])
{
int t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
int pos=1,ans=0;
//用来检测排序结果
/*for(register int i=1;i<=n;i++)
{
printf("%d ",a[i]);
}*/
for(register int i=2;i<=n;i++)
{
if(a[i]==(a[i-1]+1))//判断连续
{
pos++;
}
if(pos==3)//如果有三个连续的数字
{
ans++;
pos=1;
}
}
printf("%d",ans);
return 0;
}
感谢 m0_75232743指出代码漏洞
修改版代码如下
#include <stdio.h>
/*struct ss {
int num, pos ;
} a[1001];*/
//比较大小的自定义函数
int min(int x, int y) {
if (x >= y) {
return y;
}
return x;
}
int max(int x, int y) {
if (x >= y) {
return x;
}
return y;
}
int main() {
int n, minn = 1e+9, maxn = 0, ans = 0, a[1001], b[1001] = {0};
scanf("%d", &n);
for (register int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
b[a[i]]++;//b数组存储数字出现次数
minn = min(minn, a[i]);//划分范围
maxn = max(maxn, a[i]);
}
//printf("%d %d\n", minn, maxn);
for (register int i = minn; i <= (maxn - 2); i++) {
while (b[i] > 0 && b[i + 1] > 0 && b[i + 2] > 0) {//如果连续答案++
ans++;
b[i]--;
b[i + 1]--;
b[i + 2]--;
}
}
printf("%d", ans);
return 0;
}