首页 > 代码库 > 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 }
View Code

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 }
View Code

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 }
View Code

D题。。好像是B的加强版,用并查集搞。。明天再看看

Codeforces Round #286 (Div. 2)