首页 > 代码库 > Codeforces Round #286 (Div. 2)
Codeforces Round #286 (Div. 2)
A题。。暴力枚举在每个位置添加字符,然后检查一下是不是回文串
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <vector> 7 8 using namespace std; 9 10 #define LL long long11 #define eps 1e-812 #define inf 0x3f3f3f3f13 #define lson l, m, rt << 114 #define rson m+1, r, rt << 1 | 115 #define mnx 3100016 17 char s[20], ch[20];18 bool check(){19 int n = strlen( ch );20 for( int i = 0, j = n-1; i <= j; ++i, --j ){21 if( ch[i] != ch[j] ) return false;22 }23 return true;24 }25 int main(){26 scanf( "%s", &s );27 int n = strlen( s );28 for( int i = 0; i <= n; ++i ){29 for( int j = ‘a‘; j <= ‘z‘; ++j ){30 for( int k = 0, m = 0; k <= n; ++k ){31 if( i == k )32 ch[k] = (char)j;33 else34 ch[k] = s[m++];35 }36 ch[n+1] = ‘\0‘;37 if( check() ){38 printf( "%s\n", ch );39 return 0;40 }41 }42 }43 puts( "NA" );44 return 0;45 }
B题。。也是暴力枚举每种颜色,dfs算一下就好
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <vector> 7 8 using namespace std; 9 10 #define LL long long11 #define eps 1e-812 #define inf 0x3f3f3f3f13 #define lson l, m, rt << 114 #define rson m+1, r, rt << 1 | 115 #define mnx 50016 17 int fst[mnx], nxt[mnx], vv[mnx], col[mnx], e, ans;18 void add( int u, int v, int c ){19 vv[e] = v, col[e] = c, nxt[e] = fst[u], fst[u] = e++;20 }21 bool vis[mnx], ok;22 void dfs( int u, int gg, int vol ){23 if( u == gg ){24 ans++; ok = 1; return ;25 }26 if( vis[u] ) return ;27 vis[u] = 1;28 for( int i = fst[u]; i != -1; i = nxt[i] ){29 if( ok ) return ;30 int v = vv[i], c = col[i];31 if( c != vol ) continue;32 dfs( v, gg, vol );33 }34 }35 int main(){36 int n, m, q;37 scanf( "%d %d", &n, &m );38 memset( fst, -1, sizeof( fst ) );39 for( int i = 0; i < m; ++i ){40 int u, v, c;41 scanf( "%d %d %d", &u, &v, &c );42 add( u, v, c );43 add( v, u, c );44 }45 scanf( "%d", &q );46 while( q-- ){47 int u, v;48 scanf( "%d%d", &u, &v );49 ans = 0;50 for( int i = 1; i <= m; ++i ){51 memset( vis, 0, sizeof( vis ) );52 ok = 0;53 dfs( u, v, i );54 }55 cout << ans << endl;56 }57 return 0;58 }
C题。。比赛的时候想不出来,看了题解才知道 第二维的状态最多不超过500。。因为你1+2+...+250 > 3w,这样每次步数减一或者加一的总的状态不会超过500,所以dp[30000][600]就够了, 把第二维300当做第一次的步数d,然后每次有可能走 d+j-n - 1, d+j-n, d+j-n+1步,感觉看代码容易理解一些。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <vector> 7 8 using namespace std; 9 10 #define LL long long11 #define eps 1e-812 #define inf 0x3f3f3f3f13 #define lson l, m, rt << 114 #define rson m+1, r, rt << 1 | 115 #define mnx 3100016 17 const int N = 300;18 int dp[mnx][700], val[mnx];19 int main(){20 int n, m;21 while( scanf( "%d%d", &n, &m ) != EOF ){22 memset( val, 0, sizeof val );23 memset( dp, 0, sizeof dp );24 for( int i = 0; i < n; ++i ){25 int x;26 scanf( "%d", &x );27 val[x]++;28 }29 dp[m][N] = val[m] + val[0] + 1;30 int ans = 0;31 for( int i = m; i < mnx; ++i ){32 for( int j = 0; j < 600; ++j ){33 if( !dp[i][j] ) continue;34 int l = m + j - N;35 ans = max( dp[i][j] - 1, ans );36 if( i + l >= mnx ) continue;37 if( l > 0 )38 dp[i+l][j] = max( dp[i+l][j], dp[i][j] + val[i+l] );39 if( l > 1 )40 dp[i+l-1][j-1] = max( dp[i+l-1][j-1], dp[i][j] + val[i+l-1] );41 if( l >= 0 )42 dp[i+l+1][j+1] = max( dp[i+l+1][j+1], dp[i][j] + val[i+l+1] );43 }44 }45 cout << ans << endl;46 }47 return 0;48 }
D题。。好像是B的加强版,用并查集搞。。明天再看看
Codeforces Round #286 (Div. 2)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。