HDU YY's new problem

谁践踏了优雅 2022-08-21 03:09 82阅读 0赞

遇到一个很卡时间的题目,提交AC之后也是有时能过,有时不能过,偶然过了还真是实属不易,但是本题的思路和想法还是很需要说明一下的。

如果用纯暴力的方法,依次遍历序列中的各个数字,复杂度要O(n3),必定超时,则必须进行算法优化了,考虑到这个题目的特殊性,序列中只有n个数,而且是从1到n,需要满足的是 a-b=b-c (且a、b、c顺序不能改变)这样特点的式子,即可以转化为 a+c=2*b (且a、b、c顺序不能改变),即a+b一定要是偶数,且要采用记录下标的方法,(a+c)/2 的值所对应的下标在a的下标和c的下标之间,即可以找到满足这样关系的序列。实质为简单运用了一下Hash表。

HDU YY’s new problem http://acm.hdu.edu.cn/showproblem.php?pid=3833

代码实现如下:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. int a[10010];
  6. int b[10010];
  7. int main()
  8. {
  9. int t,n,sum;
  10. int flag;
  11. scanf("%d",&t);
  12. while(t--)
  13. {
  14. scanf("%d",&n);
  15. flag=0;
  16. memset(a,0,sizeof(a));
  17. memset(b,0,sizeof(b));
  18. for(int i=1; i<=n; i++)
  19. {
  20. scanf("%d",&a[i]);
  21. b[a[i]]=i; //记录下标
  22. }
  23. for(int i=1; i<=n; i++)
  24. {
  25. for(int j=i+1; j<=n; j++)
  26. {
  27. sum=a[i]+a[j];
  28. if(sum%2==1)
  29. continue;
  30. else if(sum%2==0)
  31. {
  32. if((b[sum/2] > b[a[i]])&&(b[sum/2] < b[a[j]])) //if((b[sum/2] > i)&&(b[sum/2] < j)
  33. {
  34. flag=1;
  35. break;
  36. }
  37. }
  38. }
  39. if(flag)
  40. break;
  41. }
  42. if(flag==1)
  43. printf("Y\n");
  44. else printf("N\n");
  45. }
  46. return 0;
  47. }

发表评论

表情:
评论列表 (有 0 条评论,82人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDU YY's new problem

    遇到一个很卡时间的题目,提交AC之后也是有时能过,有时不能过,偶然过了还真是实属不易,但是本题的思路和想法还是很需要说明一下的。 如果用纯暴力的方法,依次遍历序列中的各个数字