PRoblem B: kotomi and function
Description
kotomi最近在研究函数,突然想到一个有趣的函数。
f(n) = n的各位数字之和。例:f(233) = 2 + 3 + 3 = 8
现在有n个数,stm要询问q次。
每次询问一个y,stm都要知道在a1,a2,...,ay-1中最大的数t使得f(t) = f(ay)
Input
输入有T组数据。(1 <= T <= 5)
第一行给出n,q。(1 <= n <= 100000 ,1 <= q <= 100000)
接下来n行给出n个数字a1,a2,...,an (1 <= ai <= 1000000000)
接下来q行每行给出一个数字y。(1 <= y <= n)
Output
对于每组数据,每行输出"Case #t:",t是编号,从1开始。
接下来q行,每行一个答案。如果不存在则输出-1。
Sample Input
1
6 6
1
2
20
11
4
1
6
5
4
3
2
1
Sample Output
Case #1:
1
-1
20
2
-1
-1
HINT
每次输入第i数个a[i]的时候 判断该编号i之前有没有对应与f(a[i])相同的f(a[x]) (x<i) ,如果没有ans[i]就是-1,如果有ans[i]就是a[x];
并且按顺序每次遇到f(a[y])相同的数时,记录最大的a[y]。
#include <stdio.h>
#include <string.h>
int main()
{
int t;
scanf("%d",&t);
for(int u=1;u<=t;u++)
{
int n,q,i,j,a[100100]={0},sumb[100100]={0},b[100100]={0},suma[100100]={0};
int ans[100100]={0};
scanf("%d%d",&n,&q);
for(i=1;i<=n;i++)
{
ans[i]=-1;
scanf("%d",&a[i]);
int k=a[i];
while(k)
{
suma[i]=suma[i]+k%10;
k=k/10;
}
if(sumb[suma[i]]>0)ans[i]=sumb[suma[i]]; // 如果suma[i]是第一次出现sumb[suma[i]]为0,则不存在,反之前面会有最大的a[x]存在
if(a[i]>sumb[suma[i]])sumb[suma[i]]=a[i]; //记录最大,为后面做准备
}
printf("Case #%d:\n",u);
for(i=1;i<=q;i++)
{
int x;
scanf("%d",&x);
printf("%d\n",ans[x]);
}
}
return 0;
}