2013西安交大ACM校内赛G题

Description

河蟹在沙坡村男子职业技术学院上学期间勤工俭学,在校门开了个特色烧烤摊。他摆摊已经有n天,第i天的收益是a[i](若小于0表示赔钱)。河蟹的舍友十分关心他的收入情况,经常来询问他最近的收益情况怎么样。河蟹总是会回答两个数字X Y。这句话表示在以当前这一天为结尾的连续Y天中,河蟹一共挣了X元。为了夸大一下自己的收益,河蟹总是是回答中的X尽量大,当有多种满足X最大的回答时,选择一种Y最小的回答。你的任务是帮他找出最好的回答方式。

比如他的假期一共有5天,收益分别是 -1   4  7  -10  4。

如果河蟹在第1天被询问,他会回答: -1 1

如果河蟹在第3天被询问,他会回答: 11 2

如果河蟹在第5天被询问,他会回答: 5 4

Input

第一行是T表示有T组数据。

对于每组数据,

第一行2个整数:n,m;n表示假期天数,m表示河蟹舍友的询问次数。

接下来n行每行一个整数a[i],表示1~n天的收益。

接下来m行每行一个整数q[i],表示河蟹的舍友在第q[i]天提出了询问。保证q[i]递增给出。
Output

对于每组数据,输出一行“Case #X:“,其中X表示测试数据编号。

接下来共m行,输出两个正整数X Y,意义见题目描述
Sample Input
1
5 3
-1
4
7
-10
4
1
3
5
Sample Output
Case #1:
-1 1
11 2
5 4
Hint

1<=T<=5

1<=n<=100000,m<=n,q[i]∈[1.n],保证所任意范围内的总收益不超出[-2^30,2^30]。

好吧,我只会做简单的。这个题目思路较简单,如果之前是负的收入就不管,只把当天的输出。如果之前是正的,把当天的收入加到一个累计变量上,如果加完累计变量还是正的,那么继续下一个,否则把累计变量清零。源代码如下


#include<stdio.h>
#include<stdlib.h>
int main(){
    int t,l,i,j;
    long n,m,nt[100000],mt[100000],tc[100000],tt[100000],tempt,tempc;
    scanf("%d\n",&t);
    for(l=0;l<t;l++){
                     scanf("%ld %ld\n",&n,&m); 
                     for(i=0;i<n;i++)scanf("%ld",nt+i);
                     for(i=0;i<m;i++)scanf("%ld",mt+i);
                     tempt=0;
                     tempc=0;
                     for(i=0;i<n;i++){
                                      if(tempc>0){
                                                  tempc=tempc+nt[i];
                                                  tempt=tempt+1;
                                                  tt[i]=tempt;
                                                  tc[i]=tempc;
                                                  }
                                      else{
                                           tempt=1;
                                           tempc=nt[i];
                                           tt[i]=1;
                                           tc[i]=tempc;
                                           }
                                      }
                     printf("Case #%d: \n",l+1);
                     for(i=0;i<m;i++)printf("%ld %ld\n",tc[mt[i]-1],tt[mt[i]-1]);
                     }
    system("PAUSE");
    return 0;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值