codeforces C. Cows and Sequence 解题报告

题目链接:http://codeforces.com/problemset/problem/284/C

题目意思:给出3种操作:t = 1:在前 a 个数中每个数都加上x; t= 2:在数组末尾增加一个数k,数组长度相应增加1; t = 3:删除数组最后一个数,数组长度减少1。对于n次操作,都给出整个数组所有元素的平均值。

       一开始看见题目意思那么容易懂,于是以为很容易做,错足14次,15次终于成功了。先是TLE(对操作2直接暴力循环加),后在Test 10 wa wa wa~~~,说误差超了,全部不知道是什么回事!

      其实3个操作不需要都模拟出来,操作3是比较麻烦的,因为删除的数有可能经过 t = 1有所变化。所以很自然地想到要追踪当前要删除的数经过t = 1 时的改变,这样就需要开多一个数组来记录这些位置。

      代码中标上“关键”那里是很重要的,代表要清除操作1对数组中最后一个数的处理,否则新的一轮操作1会累加这种操作,这样结果就不正确了。

     

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn = 2*1e5 + 5;
 8 int a[maxn], mark[maxn];
 9 
10 int main()
11 {
12     int n, i, t, x, l, len;
13     while (scanf("%d", &n) != EOF)
14     {
15         memset(mark, 0, sizeof(mark));
16         a[len=1] = 0;
17         double sum = 0;
18         while (n--)
19         {
20             scanf("%d", &t);
21             if (t == 1)
22             {
23                 scanf("%d%d", &l, &x);
24                 sum += (double) l * x;
25                 mark[l] += x;
26             }
27             else if (t == 2)
28             {
29                 scanf("%d", &x);
30                 sum += x;
31                 a[++len] = x;
32             }
33             else 
34             {
35                 if (len >= 2)
36                 {
37                     sum -= a[len];         //减最后一个数
38                     sum -= mark[len];       //减最后一个数经过操作1时可能的变化
39                     mark[len-1] += mark[len];    
40                     mark[len] = 0;  // 这个是关键啊
41                     len--;
42                 }
43             }
44             printf("%.7lf\n", (double)sum/len);
45         }
46     }
47     return 0;
48 }

 

   ps:学完树状数组后会补上运用树状数组解决的方法

转载于:https://www.cnblogs.com/windysai/p/3556694.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值