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\n", 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\n", numB);
58         else if (!numB) printf("%lld\n", 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\n", 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\n", dp[1][k]);
75     }
76     return 0;
77 }
View Code

剩下的题:

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

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

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

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

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

转载于:https://www.cnblogs.com/JHSeng/p/10808748.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值