首页 > 学院 > 开发设计 > 正文

1889 kotomi and function

2019-11-06 07:29:36
字体:
来源:转载
供稿:网友

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 61 2 20 11 4 16 5 4 3 2 1

Sample Output

Case #1:1-1202-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;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表