2018 TCO Algorithm Round 1B

250 LineOff

随便搞

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 class LineOff {
 5 public:
 6     int movesToDo(string points) {
 7         stack<char> st;
 8         int ret = 0, l = points.length();
 9         for(int i = 0; i < l; ++i){
10             if(!st.empty() && st.top() == points[i]) ret++, st.pop();
11             else st.push(points[i]);
12         }
13         return ret;
14     }
15 };

Aguin

600 StablePairsDiv1

随便搞

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int, int> pii;
 4 int f[111][111][111];
 5 pii pre[111][111][111];
 6
 7 class StablePairsDiv1 {
 8 public:
 9     void get(int step, int i, int j, vector<int> & ret){
10         if(step != 1) get(step - 1, pre[step][i][j].first, pre[step][i][j].second, ret);
11         ret.push_back(i);
12         ret.push_back(j);
13     }
14     vector<int> findMaxStablePairs(int n, int c, int k) {
15         memset(f, -1, sizeof(f));
16         for(int i = 1; i <= n; ++i)
17             for(int j = i + 1; j <= n; ++j)
18                 f[1][i][j] = i + j;
19         for(int i = 1; i < k; ++i){
20             for(int j = 1; j <= n; ++j){
21                 for(int k = j + 1; k <= n; ++k){
22                     if(f[i][j][k] == -1) continue;
23                     for(int p = k + 1; p <= n; ++p){
24                         int q = j + k + c - p;
25                         if(q <= p) break;
26                         int t = f[i][j][k] + p + q;
27                         if(t > f[i+1][p][q]) f[i+1][p][q] = t, pre[i+1][p][q] = pii(j, k);
28                     }
29                 }
30             }
31         }
32         int ans = -1, ii, jj;
33         for(int i = 1; i <= n; ++i){
34             for(int j = i + 1; j <= n; ++j){
35                 if(f[k][i][j] > ans) ans = f[k][i][j], ii = i, jj = j;
36             }
37         }
38         vector<int> ret;
39         if(ans == -1) return ret;
40         get(k, ii, jj, ret);
41         return ret;
42     }
43 };

Aguin

1000 ThreeSameLetters

随便搞

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const LL mod = 1e9 + 7;
 5
 6 LL f[66][66][4][2];
 7 class ThreeSameLetters {
 8 public:
 9     int countStrings(int L, int S){
10         for(int i = 1; i <= S; ++i) f[1][i][1][0] = 1;
11         for(int i = 1; i < L; ++i){
12             for(int j = 1; j <= S; ++j){
13                 for(int k = 1; k <= 3; ++k){
14                     for(int p = 0; p <= 1; ++p){
15                         for(int q = 1; q <= S; ++q){
16                             int nk = q == j ? k + 1 : 1;
17                             if(nk > 3) continue;
18                             if(p && nk == 3) continue;
19                             int np = p || nk == 3;
20                             f[i+1][q][nk][np] = (f[i+1][q][nk][np] + f[i][j][k][p]) % mod;
21                         }
22                     }
23                 }
24             }
25         }
26         LL ans = 0;
27         for(int i = 1; i <= S; ++i) ans = (ans + f[L][i][1][1] + f[L][i][2][1] + f[L][i][3][1]) % mod;
28         return (int) ans;
29     }
30 };

Aguin

原文地址:https://www.cnblogs.com/Aguin/p/8994193.html

时间: 2024-09-30 07:42:40

2018 TCO Algorithm Round 1B的相关文章

TCO 2015 Round 1B DIV1 500 概率题

[题意]现在有一些线索,每个线索被发现的概率p[i],如果线索i被知道,那么其他线索也可能会被知道,用vector<string> c给出,c[i][j]='Y'表示知道i这个线索,j这个线索能直接知道,问最终发现的线索个数的期望. 所有p[i]的和不是1... 求每个clue被选中的概率,由题意,如果知道第i个数,那么可以立即知道其他一些点,那么可以先用floyd,求出当知道结点i后应该知道哪些结点. 然后两重求反,1-(1-p[i1])(1-p[i2])...(1-p[ik])就是所求答案

TCO 2014 Round 1C 概率DP

TCO round 1C的 250 和500 的题目都太脑残了,不说了. TCO round 1C 950 一个棋子,每次等概率的向左向右移动,然后走n步之后,期望cover的区域大小?求cover,肯定就是dp[l][r][n], 走了n步之后,左边cover了l,右边cover了r. 一开始DP没有搞清楚,这个要画一下图就更清楚了. 转移方程就是概率的传递方向. 1: double dp[505][505][2]; // l,r,n steps unsed; 2: class RedPain

Google Code Jam 2016 Round 1B B

题意:给出两个数字位数相同,分别中间有若干位不知道,用问号表示.现在要求补全这两个数字,使得差值的绝对值最小,多解则取第一个数字的值最小的,再多解就取第二个数字最小的. 分析: 类似数位dp,但是很多状态可以直接得出最终解,个别状态需要状态转移. 我们从高位到低位依次确定两个数的每个位是几.一旦确定了两个数的一个位不一样,则可以立即将小的一方的后续问号全部写9,大的一方后续问号全部写0.这样才能让差值最小. 那我们观察每个位的时候要如何确定其值呢?分如下几种情况. 1.两个数的该位都是问号,那么

TCO 2015 Round 2A DIV1

ModModMod 傻逼数论 题意: 这是一道卖萌的题..给你一个取模序列$m$,令$f(x)=(\cdots (x\ mod\ m[0])\ mod m[1])\mod m[2]\cdots $,问你$\sum_{i=1}^R f(i)$的值是多少 题解: 容易知道一点,若$i<j$且$m[i]\le m[j]$,那么$m[j]$就是没有意义的,所以首先将m变成递减序列.接下来观察每次取模后的结果,由于是从1到R,所以序列第一次取模后会变成: $$(0+1+2+\cdots+m[0]-1)+(

Google Code Jam 2014 Round 1B Problem B

二进制数位DP,涉及到数字的按位与操作. 查看官方解题报告 #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; #define MAX_LEN 50 long long A, B, K; int a[MAX_LEN], b[MAX_LEN], k[MAX_LEN]; long long memoize[MAX_LEN]

2005 TCO Online Round 1 - RectangleError

RectangleError Problem's Link Problem Statement You want to draw a rectangle on a piece of paper. Unfortunately, you are not a perfect draftsman. The lines you make, although straight, do not always have the correct lengths. The top edge has length i

【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) C】 Permutation Cycle

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] p[i] = p[p[i]]一直进行下去 在1..n的排列下肯定会回到原位置的. 即最后会形成若干个环. g[i]显然等于那个环的大小. 即让你形成若干个环. 每个环的大小只能为A或B 则相当于问Ax+By=n是否有解. 可以枚举x然后看看n-A*x能否被B整除. 构造x个长度为A的环,y个长度为B的环就好了 [代码] #include <bits/stdc++.h> using namespace std; const in

【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) B】Recursive Queries

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个记忆化搜索. 接近O(n)的复杂度吧 [代码] #include <bits/stdc++.h> using namespace std; const int N = 1e6; int g[N+10]; int pre[N+10][20]; int f(int x){ int temp = 1; while (x){ if (x%10!=0) temp*=(x%10); x/=10; } return temp; } in

【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) A】 Palindromic Supersequence

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 字符串倒着加到原串右边就好 [代码] #include <bits/stdc++.h> using namespace std; int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", stdin); #endif ios::sync_with_stdio(0),cin.tie(0); string s; cin >&