zoukankan      html  css  js  c++  java
  • 第九届校赛总结

         本来不打算写总结的,想来博客已经很久没更新了,觉得还是来一发吧。

         赶脚这次比赛纯粹是运气好,基本上是沿着这样的模式:翻到一个题 → 嗯,有思路 → 敲一敲 → 提交 → 1A → 看下一道题 .... 所以噼里啪啦交了6道水题,所以中途没有卡在哪一道题上浪费时间,(除了E题第一次提交忘了开LL),幸运地最大化利用了时间,结果莫名其妙就2nd了.... (= =#

         (PS:话说刚开场敲A的时候,一激动碰到了键盘右边的关机键,然后电脑就注销了。。销了。。了。。然后找了帅气的taos学长,让他帮我重发一下login和ranklist,所以当我过A的时候已经17分钟过去了。。现在想想真是可怕。。)

          A题:签到题。

     1 #include <stdio.h>
     2 #include <string.h>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int n;
     8     while(~scanf("%d", &n))
     9     {
    10         int sum = 0;int x;
    11         for(int i =0 ; i < n; ++i)
    12         scanf("%d", &x), sum += x;
    13         printf("%d
    ", sum);
    14             }
    15     return 0;
    16 }
    View Code

          B题:比较裸的Lucas,直接上结论:C(n,r)=(n!)*(r!)^(P-2)*(n-r)!^(P-2)%P,至于证明我说过由费马小定理可以得出a和a^(P-2)在模P运算下互为逆元,因此得证。

     1 #include <stdio.h>
     2 #include <string.h>
     3 using namespace std;
     4 
     5 typedef long long LL;
     6 const LL P = 1000000007;
     7 LL f[110000];
     8 
     9 LL Pow(LL x, LL n)
    10 {
    11     LL ans = 1LL;
    12     while(n)
    13     {
    14         if(n & 1)
    15         ans = ((ans % P) * (x % P)) % P;
    16         x = ((x % P) * (x % P)) % P;
    17         n >>= 1;
    18     }
    19     return ans;
    20 }
    21 
    22 LL c(LL n, LL r)
    23 {
    24     return  (f[n] % P) * ((Pow(f[r], P - 2) % P) * (Pow(f[n-r], P - 2) % P) % P) % P;
    25 }
    26 
    27 int main()
    28 {
    29     LL n;
    30     while(~scanf("%I64d", &n))
    31     {
    32     f[0] = 1LL;
    33     f[1] = 1LL;
    34         for(LL i = 2LL; i <= n; ++i)
    35         f[i] = (f[i-1] % P * i) % P;
    36                 for(LL i = 0LL; i < n; ++i)
    37         printf("%I64d ", c(n, i));
    38         printf("1
    ");
    39 //          LL m, r;
    40 //         scanf("%I64d%I64d", &m, &r);
    41 //         printf("%I64d
    ", c(m, r));
    42     }
    43     return 0;
    44 }
    View Code

          C题:留坑待填,据说用DP,又据说暴力可过,没看到题目说最多分解成4项,QwQ。

          D题:水题,把元素装进一个muiltiset里面,然后对于每个元素a,在其中查找s-a,然后对于s=2*a的情况特判一下即可。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <set>
     4 using namespace std;
     5 
     6 int a[110000];
     7 
     8 int main()
     9 {
    10     int t;
    11     while(~scanf("%d", &t))
    12     {
    13         while(t--)
    14         {
    15             multiset<int> ms;
    16             ms.clear();
    17             int n, s;
    18             scanf("%d", &n);
    19             for(int i = 0; i < n; ++i)
    20             scanf("%d", &a[i]), ms.insert(a[i]);
    21             scanf("%d", &s);
    22 
    23             bool flag = 0;
    24             for(int i = 0; i < n; ++i)
    25             {
    26             //    printf("%d
    ", ms.count(s - a[i]));
    27             if(ms.count(s - a[i]) != 0)
    28             {
    29                 if(s != 2 * a[i])
    30                 {
    31                  flag = 1; break;
    32                 }
    33                 else
    34                 {
    35                     if(ms.count(s - a[i]) >= 2)
    36                    {
    37                        flag = 1; break;
    38                    }
    39                 }
    40             }
    41 
    42             }
    43 //
    44 //            multiset<int>::iterator it;
    45 //            for(it = ms.begin(); it != ms.end(); ++it)
    46 //            printf("%d ", *it);
    47 //            puts("");
    48 
    49             if(flag) puts("Yes");
    50             else puts("No");
    51         }
    52     }
    53     return 0;
    54 }
    View Code

          E题:水题,本来封榜之后准备弃疗,然后看了下这个题,觉得好像可以搞一搞,然后发现是个大水题,2333....关键就是由∑((xi-xj)^2+(yi-yj)^2) 化为 (n-1)(∑xi^2+∑yi^2)+∑xi*(sn-si)+∑yi*(tn-yi)即可,(其中si=∑xi,ti=∑yi),复杂度由O(n^2)降为O(n)。

     1 #include <stdio.h>
     2 using namespace std;
     3 
     4 typedef long long LL;
     5 const int N = 110000;
     6 LL a[N], b[N], sum1[N], sum2[N];
     7 
     8 int main()
     9 {
    10     int n;
    11     while(~scanf("%d", &n))
    12     {
    13         LL tep1 = 0, tep2 = 0;
    14         sum1[0] = 0, sum2[0] = 0;
    15         for(int i = 1; i <= n; ++i)
    16         {
    17         scanf("%I64d%I64d", &a[i], &b[i]);
    18         tep1 += a[i] * a[i];
    19         tep2 += b[i] * b[i];
    20         sum1[i] = sum1[i-1] + a[i];
    21         sum2[i] = sum2[i-1] + b[i];
    22         }
    23 
    24         LL tep3 = (n - 1) * (tep1 + tep2);
    25 
    26         LL tep4 = 0, tep5 = 0;
    27          for(int i = 1; i < n; ++i)
    28           tep4 += a[i] * (sum1[n] - sum1[i]);
    29          for(int i = 1; i < n; ++i)
    30           tep5 += b[i] * (sum2[n] - sum2[i]);
    31 
    32           LL ans = tep3 - 2 * (tep4 + tep5);
    33             printf("%I64d
    ", ans);
    34     }
    35     return 0;
    36 }
    View Code

          F题:水过去的,用抛物线方程跟墙的方程联立,没啥可说的。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <math.h>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const double g = 9.8;
     8 double a[11000];
     9 
    10 struct Wall
    11 {
    12     double x, y;
    13 } w[110000], ans[11000];
    14 
    15 bool cmpx(Wall a, Wall b)
    16 {
    17     return a.x < b.x;
    18 }
    19 
    20 int main()
    21 {
    22    // freopen("f.txt", "w", stdin);
    23     int n;
    24     double v;
    25     while(~scanf("%d%lf", &n, &v))
    26     {
    27         for(int i = 0; i < n; ++i)
    28             scanf("%lf", &a[i]);
    29         int m;
    30         scanf("%d", &m);
    31         for(int i = 0 ; i < m; ++i)
    32             scanf("%lf%lf", &w[i].x, &w[i].y);
    33         sort(w, w + m, cmpx);
    34 
    35         for(int i = 0; i < n; ++i)
    36         {
    37         double vx, vy, h, x0, d;
    38         vx = v * cos(a[i]);
    39         vy = v * sin(a[i]);
    40         h = vy * vy / (2.0 * g);
    41         x0 = v * v * sin(2.0 * a[i]) / g;
    42         d = 2.0 * vy * vy / (g * x0 * x0);
    43             bool flag = 0;
    44             for(int j = 0; j < m; ++j)
    45             {
    46                 double yt = -d * w[j].x * (w[j].x - x0);
    47                 if(0 <= yt && yt <= w[j].y)
    48                 {
    49                     ans[i].x = w[j].x, ans[i].y = yt;
    50                     flag = 1;
    51                     break;
    52                 }
    53             }
    54             if(!flag)
    55             ans[i].x = x0, ans[i].y = 0;
    56         }
    57 
    58         for(int i = 0; i < n; ++i)
    59        printf("%.6f %.6f
    ", ans[i].x,ans[i].y);
    60     }
    61     return 0;
    62 }
    View Code

          G题:留坑待填,据说用高斯消元。

          H题:简单的公式题,palapala一顿搞,结果就是ans=2*v*T^2/t,没啥可说的。

     1 #include <stdio.h>
     2 #include <string.h>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     double T, v, t;
     8     while(~scanf("%lf%lf%lf", &T, &v, &t))
     9     {
    10         double ans = 2 * v * T * T / t;
    11         printf("%.5f
    ", ans);
    12     }
    13     return 0;
    14 }
    View Code

          I题:模拟题,嫌题目太啰嗦没看,留坑待填。

          J题:离散+博弈,居然有人过,orz....,留坑待填。

       以上。

  • 相关阅读:
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/qiucz/p/4422688.html
Copyright © 2011-2022 走看看