zoukankan      html  css  js  c++  java
  • 2014-2015 ACM-ICPC Central Europe Regional Contest (CERC 2014)

    原标题应该叫“SCUT五四青年节软件集训队快乐训练赛”。本来应该很快乐才对,但是没想到毒瘤BPM136居然挑了套区域赛题(虽然不是很难),而且队友基本有事导致变成个人solo,这就非常不快乐了。

    而且题风有点诡异,做完四道签到之后剩下的要么看不懂要么就是各种dp。

    题目链接:http://codeforces.com/gym/100543


    C:

    一点意思都没有的签到题,因为没留意爆了int交了三发wa。

     1 /* basic header */
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 #include <string>
     6 #include <cstring>
     7 #include <cmath>
     8 #include <cstdint>
     9 #include <climits>
    10 #include <float.h>
    11 /* STL */
    12 #include <vector>
    13 #include <set>
    14 #include <map>
    15 #include <queue>
    16 #include <stack>
    17 #include <algorithm>
    18 #include <array>
    19 #include <iterator>
    20 /* define */
    21 #define ll long long
    22 #define dou double
    23 #define pb emplace_back
    24 #define mp make_pair
    25 #define fir first
    26 #define sec second
    27 #define sot(a,b) sort(a+1,a+1+b)
    28 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    29 #define rep0(i,a,b) for(int i=a;i<b;++i)
    30 #define repa(i,a) for(auto &i:a)
    31 #define eps 1e-8
    32 #define int_inf 0x3f3f3f3f
    33 #define ll_inf 0x7f7f7f7f7f7f7f7f
    34 #define lson curPos<<1
    35 #define rson curPos<<1|1
    36 /* namespace */
    37 using namespace std;
    38 /* header end */
    39 
    40 const int maxn = 1e5 + 10;
    41 ll a[maxn];
    42 
    43 void init()
    44 {
    45     rep0(i, 1, 1e5)
    46     a[i] = (ll)i * (ll)(i - 1) / 2;
    47 }
    48 
    49 int main()
    50 {
    51     init();
    52     int t; cin >> t;
    53     while (t--)
    54     {
    55         ll n; cin >> n;
    56         int flag = 0;
    57         rep0(i, 2, 100000)
    58         {
    59             if (a[i] < n && (n - a[i]) % (ll)i == 0)
    60             {
    61                 cout << n << " = ";
    62                 int pos = (n - a[i]) / (ll)i;
    63                 rep0(j, 0, i)
    64                 {
    65                     if (j) cout << " + ";
    66                     cout << pos + (ll)j;
    67                 }
    68                 flag = 1;
    69                 break;
    70             }
    71         }
    72         if (!flag) cout << "IMPOSSIBLE" << endl;
    73         else cout << endl;
    74     }
    75     return 0;
    76 }
    View Code

    D:

    问轮子转动状态的物理题,也很签到。

      1 /* basic header */
      2 #include <iostream>
      3 #include <cstdio>
      4 #include <cstdlib>
      5 #include <string>
      6 #include <cstring>
      7 #include <cmath>
      8 #include <cstdint>
      9 #include <climits>
     10 #include <float.h>
     11 /* STL */
     12 #include <vector>
     13 #include <set>
     14 #include <map>
     15 #include <queue>
     16 #include <stack>
     17 #include <algorithm>
     18 #include <array>
     19 #include <iterator>
     20 /* define */
     21 #define ll long long
     22 #define dou double
     23 #define pb emplace_back
     24 #define mp make_pair
     25 #define fir first
     26 #define sec second
     27 #define sot(a,b) sort(a+1,a+1+b)
     28 #define rep1(i,a,b) for(int i=a;i<=b;++i)
     29 #define rep0(i,a,b) for(int i=a;i<b;++i)
     30 #define repa(i,a) for(auto &i:a)
     31 #define eps 1e-8
     32 #define int_inf 0x3f3f3f3f
     33 #define ll_inf 0x7f7f7f7f7f7f7f7f
     34 #define lson curPos<<1
     35 #define rson curPos<<1|1
     36 /* namespace */
     37 using namespace std;
     38 /* header end */
     39 
     40 struct Node
     41 {
     42     int x, y, r, q, frac, nume;
     43 };
     44 
     45 const int maxn = 1e4 + 10;
     46 Node wheel[maxn];
     47 queue<int>q;
     48 int vis[maxn];
     49 
     50 int check(int p, int q)
     51 {
     52     if ((wheel[p].x - wheel[q].x) * (wheel[p].x - wheel[q].x) + (wheel[p].y - wheel[q].y) * (wheel[p].y - wheel[q].y) == (wheel[p].r + wheel[q].r) * (wheel[p].r + wheel[q].r))
     53         return 1;
     54     else return 0;
     55 }
     56 
     57 int main()
     58 {
     59     while (!q.empty()) q.pop();
     60     int t; scanf("%d", &t);
     61     while (t--)
     62     {
     63         int n; scanf("%d", &n);
     64         rep1(i, 1, n)
     65         {
     66             vis[i] = 0;
     67             scanf("%d%d%d", &wheel[i].x, &wheel[i].y, &wheel[i].r);
     68             wheel[i].frac = wheel[i].nume = 1; wheel[i].q = i == 1 ? 1 : 0;
     69         }
     70         q.push(1);
     71         while (!q.empty())
     72         {
     73             int curr = q.front(); q.pop();
     74             if (vis[curr]) continue;
     75             vis[curr] = 1;
     76             rep1(i, 1, n)
     77             {
     78                 if (vis[i]) continue;
     79                 if (check(i, curr))
     80                 {
     81                     wheel[i].q = -wheel[curr].q;
     82                     wheel[i].frac = wheel[curr].frac * wheel[curr].r;
     83                     wheel[i].nume = wheel[curr].nume * wheel[i].r;
     84                     int gcd = __gcd(wheel[i].frac, wheel[i].nume);
     85                     wheel[i].frac /= gcd, wheel[i].nume /= gcd;
     86                     q.push(i);
     87                 }
     88             }
     89         }
     90         rep1(i, 1, n)
     91         if (!wheel[i].q) puts("not moving");
     92         else if (wheel[i].q == 1)
     93         {
     94             printf("%d", wheel[i].frac);
     95             if (wheel[i].nume != 1) printf("/%d", wheel[i].nume);
     96             puts(" clockwise");
     97         }
     98         else
     99         {
    100             printf("%d", wheel[i].frac);
    101             if (wheel[i].nume != 1) printf("/%d", wheel[i].nume);
    102             puts(" counterclockwise");
    103         }
    104     }
    105     return 0;
    106 }
    View Code

    H:

    因为数字长度有限制,所以可以dfs预处理一遍所有可行的数字,于是变成傻逼题。

     1 /* basic header */
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 #include <string>
     6 #include <cstring>
     7 #include <cmath>
     8 #include <cstdint>
     9 #include <climits>
    10 #include <float.h>
    11 /* STL */
    12 #include <vector>
    13 #include <set>
    14 #include <map>
    15 #include <queue>
    16 #include <stack>
    17 #include <algorithm>
    18 #include <array>
    19 #include <iterator>
    20 /* define */
    21 #define ll long long
    22 #define dou double
    23 #define pb emplace_back
    24 #define mp make_pair
    25 #define fir first
    26 #define sec second
    27 #define sot(a,b) sort(a+1,a+1+b)
    28 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    29 #define rep0(i,a,b) for(int i=a;i<b;++i)
    30 #define repa(i,a) for(auto &i:a)
    31 #define eps 1e-8
    32 #define int_inf 0x3f3f3f3f
    33 #define ll_inf 0x7f7f7f7f7f7f7f7f
    34 #define lson curPos<<1
    35 #define rson curPos<<1|1
    36 /* namespace */
    37 using namespace std;
    38 /* header end */
    39 
    40 set<int>num;
    41 vector<int>v[10];
    42 const int px[] = {4, 1, 1, 1, 2, 2, 2, 3, 3, 3};
    43 const int py[] = {2, 1, 2, 3, 1, 2, 3, 1, 2, 3};
    44 
    45 void dfs(int curDig, int curNum, int len)
    46 {
    47     curNum += curDig; num.insert(curNum);
    48     if (len > 3) return;
    49     rep0(i, 0, v[curDig].size())
    50     dfs(v[curDig][i], curNum * 10, len + 1);
    51 }
    52 
    53 int main()
    54 {
    55     rep1(i, 0, 9)
    56     {
    57         rep1(j, 0, 9)
    58         if (px[i] <= px[j] && py[i] <= py[j])
    59             v[i].pb(j);
    60     }
    61     rep1(i, 0, 9) dfs(i, 0, 0);
    62     int t; scanf("%d", &t);
    63     while (t--)
    64     {
    65         int n; scanf("%d", &n);
    66         set<int>::iterator it = num.lower_bound(n);
    67         int a = *it;
    68         if (it != num.begin())
    69         {
    70             int b = *(--it);
    71             if (n - b < a - n) a = b;
    72         }
    73         printf("%d
    ", a);
    74     }
    75     return 0;
    76 }
    View Code

    I:

    注意一下没有W或没有B的情况就好了。

     1 /* basic header */
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 #include <string>
     6 #include <cstring>
     7 #include <cmath>
     8 #include <cstdint>
     9 #include <climits>
    10 #include <float.h>
    11 /* STL */
    12 #include <vector>
    13 #include <set>
    14 #include <map>
    15 #include <queue>
    16 #include <stack>
    17 #include <algorithm>
    18 #include <array>
    19 #include <iterator>
    20 /* define */
    21 #define ll long long
    22 #define dou double
    23 #define pb emplace_back
    24 #define mp make_pair
    25 #define fir first
    26 #define sec second
    27 #define sot(a,b) sort(a+1,a+1+b)
    28 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    29 #define rep0(i,a,b) for(int i=a;i<b;++i)
    30 #define repa(i,a) for(auto &i:a)
    31 #define eps 1e-8
    32 #define int_inf 0x3f3f3f3f
    33 #define ll_inf 0x7f7f7f7f7f7f7f7f
    34 #define lson curPos<<1
    35 #define rson curPos<<1|1
    36 /* namespace */
    37 using namespace std;
    38 /* header end */
    39 
    40 const int maxn = 1e5 + 10;
    41 char s[maxn][1];
    42 int a[maxn], n;
    43 
    44 int main()
    45 {
    46     int t; scanf("%d", &t);
    47     while (t--)
    48     {
    49         scanf("%d", &n);
    50         ll numW = 0, numB = 0;
    51         rep0(i, 0, n)
    52         {
    53             scanf("%d%s", &a[i], s[i]);
    54             if (s[i][0] == 'W') numW += a[i];
    55             else numB += a[i];
    56         }
    57         if (!numW) printf("%lld
    ", numB);
    58         else if (!numB) printf("%lld
    ", numW);
    59         else
    60         {
    61             int ans = 0; ll gcd = __gcd(numW, numB), lastW = 0, lastB = 0;
    62             numW /= gcd, numB /= gcd;
    63             rep0(i, 0, n)
    64             if (s[i][0] == 'W')
    65             {
    66                 if (!(lastB % numB))
    67                 {
    68                     if ((lastW + a[i]) / numW >= lastB / numB && lastW / numW < lastB / numB) ans++;
    69                 }
    70                 lastW += a[i];
    71             }
    72             else
    73             {
    74                 if (!(lastW % numW))
    75                 {
    76                     if ((lastB + a[i]) / numB >= lastW / numW && lastB / numB < lastW / numW) ans++;
    77                 }
    78                 lastB += a[i];
    79             }
    80             printf("%d
    ", ans);
    81         }
    82     }
    83     return 0;
    84 }
    View Code

    K:

    还算简单的dp。定义二维数组dp,第一维是从第i个物品到最后一个物品,第二维是还剩多少次魔法使用次数。dp[i][j]代表可获取的最大价值。

    显然倒着处理就完事了。我居然把dp[i+1][j-1]写成dp[i+1][j]导致wa了一发,真的dd。

     1 /* basic header */
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 #include <string>
     6 #include <cstring>
     7 #include <cmath>
     8 #include <cstdint>
     9 #include <climits>
    10 #include <float.h>
    11 /* STL */
    12 #include <vector>
    13 #include <set>
    14 #include <map>
    15 #include <queue>
    16 #include <stack>
    17 #include <algorithm>
    18 #include <array>
    19 #include <iterator>
    20 /* define */
    21 #define ll long long
    22 #define dou double
    23 #define pb emplace_back
    24 #define mp make_pair
    25 #define fir first
    26 #define sec second
    27 #define sot(a,b) sort(a+1,a+1+b)
    28 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    29 #define rep0(i,a,b) for(int i=a;i<b;++i)
    30 #define repa(i,a) for(auto &i:a)
    31 #define eps 1e-8
    32 #define int_inf 0x3f3f3f3f
    33 #define ll_inf 0x7f7f7f7f7f7f7f7f
    34 #define lson curPos<<1
    35 #define rson curPos<<1|1
    36 /* namespace */
    37 using namespace std;
    38 /* header end */
    39 
    40 struct Item
    41 {
    42     int c, v;
    43     bool operator<(const Item &rhs) const
    44     {
    45         return v < rhs.v;
    46     }
    47 };
    48 const int maxn = 150000 + 10;
    49 Item item[maxn];
    50 int n, k, dp[maxn][11];
    51 //dp[i][j]: max benefit
    52 //first dir: from Ith to Nth items
    53 //second dir: remain J times to use magic
    54 //dp[1][k] should be answer
    55 
    56 int main()
    57 {
    58     int t; scanf("%d", &t);
    59     while (t--)
    60     {
    61         scanf("%d%d", &n, &k);
    62         rep1(i, 1, n) scanf("%d%d", &item[i].v, &item[i].c);
    63         sot(item, n);
    64         //init
    65         rep1(i, 0, k) dp[n + 1][i] = 0;
    66         for (int i = n; i >= 1; i--)
    67             for (int j = 0; j <= k; j++)
    68             {
    69                 if (!j) //border
    70                     dp[i][j] = max(dp[i + 1][j], item[i].v - item[i].c);
    71                 else //compare two situations: use or not use magic
    72                     dp[i][j] = max(dp[i + 1][j], min(item[i].v - item[i].c, dp[i + 1][j - 1] - item[i].c)); //fuck
    73             }
    74         printf("%d
    ", dp[1][k]);
    75     }
    76     return 0;
    77 }
    View Code

    剩下的题:

    E:貌似可以用数据结构搞搞?没想法。

    F:貌似是个dp+组合数+逆元。

    L:题目意思是有n个敌人,在第ai个时刻会出现在距离你ci的位置(不会移动),他必须在第bi个时刻(或之前)被消灭。你有一把武器,每次启动可以以代价D消灭距离<=D以内的所有敌人。问消灭所有敌人所需最小代价。

    一看就是区间dp (不想动了,丢给队友

    看了没想法 || 看不懂,以后再补 (咕咕咕

  • 相关阅读:
    NSDate的处理:前一天、后一天等关于时区偏移的处理以及在数据库中的使用
    《powershell 的版本号所引起的载入 FSharp 编译器问题》基本解决
    hdu 2055 An easy problem (java)
    昨天登陆页面,无法进入后台,今天攻克了
    关于ubuntu下qt编译显示Cannot connect creator comm socket /tmp/qt_temp.xxx/stub-socket的解决的方法
    (转)Struts2的拦截器
    (转)Struts2的标签库
    (转)OGNL与值栈
    (转)Struts2访问Servlet的API及......
    (转)Struts2快速入门
  • 原文地址:https://www.cnblogs.com/JHSeng/p/10808748.html
Copyright © 2011-2022 走看看