Description
给你一个正整数序列a1, a2, ..., an.,找出所有的i, 满足第i个数是其他所有数的平均数。
Input
第一行是一个正整数T,表示测试用例个数。每个测试用例的第一行是一个正整数n(2 ≤ n ≤ 2·105)。第二行是n个正整数a1, a2, ..., an (1 ≤ ai≤ 1000)。
Output
对于每组测试用例,第一行输出满足条件的数的个数,第二行输出所有满足条件的数的编号(两编号之间用一个空格隔开),编号为从1到n的正整数。
如果不存在满足条件的数,输出一个0,不用输出第二行。
Sample Input
341 309 455 12751 2 3 4 5450 50 50 50
Sample Output
01341 2 3 4
思路:
用两个数组
一个数组将输入的数储存起来用于循环比较大小
另一个数组将下标储存用于输出下标
注:注意将和转化为double型 不然可能会出现4/3=4/4的情况。导致题目WA。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int a[200001];
int b[200001];
int T;
scanf("%d",&T);
int n;
int i,j,k;
int sum;
int flag;
while(T--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
sum=0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
sum += a[i];
}
j=0;
flag=0;
for(i=0; i<n; i++)
{
if(((double)sum-a[i])/(n-1)==a[i])//double很关键
{
b[j]=i+1;//储存下标 即第n个数
flag++;
j++;
}
}
if(flag==0)
printf("0\n");
else
{
printf("%d\n",flag);
for(k=0; k<flag; k++)//注意输出格式
if(k==0)
printf("%d",b[k]);
else
printf(" %d",b[k]);
printf("\n");
}
}
return 0;
}