UESTC 1269-ZhangYu Speech
ZhangYu Speech
Edit
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
SubmitStatus
as we all know, ZhangYu(Octopus vulgaris) brother has a very famous speech - “Keep some distance from me”. ZhangYu brother is so rich that everyone want to contact he, and scfkcf is one of them. One day , ZhangYu brother agreed with scfkcf to contact him if scfkcf could beat him. There are n digits(lets give them indices from 1 to n and name them a 1 ,a 2 …a N ) and some queries.
for each query:
- ZhangYu brother choose an index x from 1 to n .
- For all indices y ( y < x ) calculate the difference b y =a x −a y .
- Then ZhangYu brother calculate B 1 ,the sum of all by which are greater than 0 , and scfkcf calculate B 2 , the sum of all by which are less than 0 .
if B 1 >|B 2 | , ZhangYu brother won and did not agree with scfkcf to contact him; else if B 1 is equals to |B 2 | , ZhangYu brother would ignore the result; else if B 1 < |B 2 | , ZhangYu brother lost and agreed with scfkcf to contact him.
Input
The first line contains two integers n , m (1≤n,m≤100000) denoting the number of digits and number of queries. The second line contains n digits (without spaces) a 1 ,a 2 ,…,a n .(0≤a i ≤9) Each of next m lines contains single integer x (1≤x≤n) denoting the index for current query.
Output
For each of m queries print “Keep some distance from me” if ZhangYu won, else print “Next time” if ZhangYu brother ignored the result, else print “I agree” if ZhangYu brother lost in a line - answer of the query.
Sample input and output
Sample Input | Sample Output |
---|---|
|
|
Hint
It’s better to use “scanf” instead of “cin” in your code.
Source
第七届ACM趣味程序设计竞赛第四场(正式赛)
题目大意: 给出有n个数字的字符串,m表示有多少个比赛回合,给出一个x则会就是第几个数,用这个数将他前面的数都减一遍,当差大于零的时候加到b1上,当小于零时加到b2上,最后都取绝对值,比较b1和b2的大小。 这个题主要注意超时,事先可以化简这个式子,得到公式,就是(x-1)*(map[x-1]-‘0’)-前x-1项和。所以只需要在运算前保留一下各个位置的前几项和就可以节约很多时间。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char map[10000000];
int wo6[1000000],wo6defeiqi[1000000];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
scanf("%s",map);
int i,j;
for(i=1;i<=n;i++)
{
wo6[i]=map[i-1]-'0';
}
for(i=1;i<=n;i++)
{
wo6defeiqi[i]=wo6[i]+wo6defeiqi[i-1];
}
while(m--)
{
int axiba;
int xx;
scanf("%d",&xx);
axiba=(xx)*(map[xx-1]-'0')-wo6defeiqi[xx];
if(axiba>0)
printf("Keep some distance from me\n");
else if(axiba==0)
printf("Next time\n");
else if(axiba<0)
printf("I agree\n");
}
}
return 0;
}
还没有评论,来说两句吧...