• 组队赛3


    URAL 2025 Line Fighting

    题意:有n个人,要分成k支队,问你最多能够进行多少场比赛。。贪心,尽量平均分,就能够进行最多场的比赛。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <vector>
     6 #include <algorithm>
     7 
     8 using namespace std;
     9 
    10 #define LL long long
    11 #define eps 1e-8
    12 #define inf 0x3f3f3f3f
    13 #define lson l, m, rt<<1
    14 #define rson m+1, r, rt<<1|1
    15 #define mnx 10100
    16 #define mod 1000000007
    17 
    18 int a[mnx];
    19 int main(){
    20     int n, m, cas;
    21     scanf( "%d", &cas );
    22     while( cas-- ){
    23         scanf( "%d%d", &n, &m );
    24         int tmp = n / m;
    25         for( int i = 1; i <= m; ++i ){
    26             a[i] = tmp;
    27         }
    28         tmp = n % m;
    29         for( int i = 1; i <= tmp; ++i ){
    30             a[i]++;
    31         }
    32         for( int i = 1; i <= m; ++i ){
    33             a[i] = a[i-1] + a[i];
    34         }
    35         LL ans = 0;
    36         for( int i = 1; i <= m; ++i ){
    37             ans += (LL)( a[m] - a[i] ) * ( a[i] - a[i-1] );
    38         }
    39         cout << ans << endl;
    40     }
    41     return 0;
    42 }
    View Code

    POJ 2551 Ones

    题意:给你一个既不能被2又不能被5整除的数n,问你长度为多少的只含1的数能够整除 n。。

    做法:数据比较小,暴力找就好了,肯定能够找到。前几天做过问 长度为多少的只含8的数能够整除n,那道题的数据比较大,用欧拉函数搞。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <vector>
     7 #include <queue>
     8 
     9 using namespace std;
    10 
    11 #define LL long long
    12 #define eps 1e-6
    13 #define inf 0x3f3f3f3f
    14 #define mod 1000
    15 #define MP make_pair
    16 #define mnx 10050
    17 
    18 int main(){
    19     int n;
    20     while( scanf( "%d", &n ) != EOF ){
    21         int tmp = 1, ans = 1;
    22         while( tmp % n ){
    23             ans++;
    24             tmp = ( tmp % n ) * 10 + 1;
    25         }
    26         printf( "%d
    ", ans );
    27     }
    28     return 0;
    29 }
    View Code

    POJ 1905 Expanding Rods

    题意:给你一条弦还有圆弧的长度,问你 弦的中心到圆弧中心的距离。

    做法:二分答案就好了。最开始做的时候二分角度没跑出来,以为不是单调的,后来爬山又跪了,心好塞。没想到是单调的,二分答案就好了。还有poj交G++的时候浮点数要用.3f

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <vector>
     7 #include <queue>
     8 
     9 using namespace std;
    10 
    11 #define LL long long
    12 #define eps 1e-8
    13 #define inf 0x3f3f3f3f
    14 #define mod 1000
    15 #define MP make_pair
    16 #define mnx 25
    17 
    18 int main(){
    19     double seg, c, n, len;
    20     while( scanf( "%lf%lf%lf", &seg, &n, &c ) != EOF && seg >= 0 ){
    21         len = seg + seg * c * n;
    22         double l = 0, r = seg/2;
    23         while( r - l > eps ){
    24             double m = ( r + l ) / 2;
    25             double R = ( m*m + (seg/2)*(seg/2) ) / (2*m);
    26             double a = asin( seg / 2 / R );
    27             double len2 = 2 * a * R;
    28             if( len2 > len )
    29                 r = m;
    30             else l = m;
    31         }
    32         printf( "%.3lf
    ", l );
    33     }
    34     return 0;
    35 }
    View Code

    HDU 4003 Find Metal Mineral

    看别人的题解吧,这里。不会做。现在好像有点明白了,树形dp + 背包。。C++能过,但G++不知道为什么TLE了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <vector>
     7 #include <queue>
     8 
     9 using namespace std;
    10 
    11 #define LL long long
    12 #define eps 1e-6
    13 #define inf 0x3f3f3f3f
    14 #define mod 1000
    15 #define MP make_pair
    16 #define mnx 20050
    17 
    18 int n, s, k, dp[mnx][20];
    19 int vv[mnx], fst[mnx], cost[mnx], nxt[mnx], e;
    20 void add( int u, int v, int c ){
    21     vv[e] = v, nxt[e] = fst[u], cost[e] = c, fst[u] = e++;
    22 }
    23 void dfs( int u, int fa ){
    24     for( int i = fst[u]; i != -1; i = nxt[i] ){
    25         int v = vv[i], c = cost[i];
    26         if( v == fa ) continue;
    27         dfs( v, u );
    28         for( int j = k; j >= 0; --j ){
    29             dp[u][j] += dp[v][0] + 2 * c;
    30             for( int jj = 1; jj <= j; ++jj ){
    31                 dp[u][j] = min( dp[u][j], dp[u][j-jj] + dp[v][jj] + jj * c );
    32             }
    33         }
    34     }
    35 }
    36 int main(){
    37     while( scanf( "%d%d%d", &n, &s, &k ) != EOF ){
    38         memset( fst, -1, sizeof fst );
    39         memset( dp, 0, sizeof dp );
    40         e = 0;
    41         int u, v, c;
    42         for( int i = 0; i < n-1; ++i ){
    43             scanf( "%d%d%d", &u, &v, &c );
    44             add( u, v, c );
    45             add( v, u, c );
    46         }
    47         dfs( s, -1 );
    48         printf( "%d
    ", dp[s][k] );
    49     }
    50     return 0;
    51 }
    View Code

    ZOJ 1542 Network

    题意:给你一个图,让你把图联通,同时使权值最大的边尽量小。

    做法:最小生成树的kruskal算法,题目有spj的。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <vector>
     6 #include <algorithm>
     7 
     8 using namespace std;
     9 
    10 #define LL long long
    11 #define eps 1e-8
    12 #define lson l, m, rt<<1
    13 #define rson m+1, r, rt<<1|1
    14 #define mnx 100100
    15 
    16 struct edge{
    17     int u, v, c;
    18     bool operator < ( const edge &b ) const {
    19         return c < b.c;
    20     }
    21     void input(){
    22         scanf( "%d%d%d", &u, &v, &c );
    23     }
    24 }e[mnx];
    25 int fa[mnx];
    26 int find( int x ){
    27     if( fa[x] != x )
    28         fa[x] = find( fa[x] );
    29     return fa[x];
    30 }
    31 int uu[mnx], vv[mnx];
    32 int main(){
    33     int n, m;
    34     while( scanf( "%d%d", &n, &m ) != EOF ){
    35         for( int i = 0; i <= n; ++i )
    36             fa[i] = i;
    37         for( int i = 0; i < m; ++i ){
    38             e[i].input();
    39         }
    40         sort( e, e + m );
    41         int ans = 0, cnt = 0;
    42         for( int i = 0; i < m; ++i ){
    43             int u = e[i].u, v = e[i].v, c = e[i].c;
    44             if( find(u) != find(v) ){
    45                 fa[find(v)] = find(u);
    46                 ans = c;
    47                 uu[cnt] = u, vv[cnt++] = v;
    48             }
    49         }
    50         printf( "%d
    %d
    ", ans, cnt );
    51         for( int i = 0; i < cnt; ++i )
    52             printf( "%d %d
    ", uu[i], vv[i] );
    53     }
    54     return 0;
    55 }
    View Code

    URAL 2027 URCAPL, Episode 1

    题意:自己看吧。

    做法:模拟题,细心一点就可以过了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <vector>
     7 #include <queue>
     8 
     9 using namespace std;
    10 
    11 #define LL long long
    12 #define eps 1e-6
    13 #define inf 0x3f3f3f3f
    14 #define mod 1000
    15 #define MP make_pair
    16 #define mnx 105
    17 
    18 int n, m, tot, cnt, a[mnx*1000], cur, L[30], step;
    19 char ch[mnx][mnx];
    20 int dx[5] = { -1, 0, 1, 0 }, dy[5] = { 0, 1, 0, -1 }, D;
    21 bool out( int x, int y ){
    22     if( x < 0 || y < 0 || x >= n || y >= m ) return 1;
    23     return 0;
    24 }
    25 int gao( int x, int y ){
    26     if( out( x, y ) ) return 1;
    27     char c = ch[x][y];
    28     if( c == '?' ){
    29         cur = a[cnt++];
    30         if( cnt >= tot ) cnt = tot - 1;
    31     }
    32     else if( c >= 'A' && c <= 'Z' )
    33         swap( cur, L[c-'A'] );
    34     else if( c == '!' ){
    35         printf( "%d
    ", cur );
    36         cur = 0;
    37     }
    38     else if( c == '^' )
    39         D = 0;
    40     else if( c == '>' )
    41         D = 1;
    42     else if( c == 'v' )
    43         D = 2;
    44     else if( c == '<' )
    45         D = 3;
    46     else if( c == '+' )
    47         cur++;
    48     else if( c == '-' )
    49         cur--;
    50     else if( c == '@' ){
    51         if( cur == 0 )
    52             D = ( D + 4 - 1 ) % 4;
    53         else D = ( D + 1 ) % 4;
    54     }
    55     else if( c == '#' )
    56         return -1;
    57     return 0;
    58 }
    59 int main(){
    60     scanf( "%d%d", &n, &m );
    61     for( int i = 0; i < n; ++i )
    62         scanf( "%s", ch[i] );
    63     scanf( "%d", &tot);
    64     for( int i = 0; i < tot; ++i )
    65         scanf( "%d", &a[i] );
    66     int x = 0, y = 0;
    67     D = 1, step = 0;
    68     while( 1 ){
    69         int ok = gao( x, y );
    70         if( ok == 1 ){
    71             puts( "RUNTIME ERROR" ); break;
    72         }
    73         if( ok == -1 ){
    74             break;
    75         }
    76         if( abs(cur) > 100000 ){
    77             puts( "OVERFLOW ERROR" ); break;
    78         }
    79         step++;
    80         if( step >= 1000000 ){
    81             puts( "TIME LIMIT EXCEEDED" ); break;
    82         }
    83         x = x + dx[D], y = y + dy[D];
    84     }
    85     return 0;
    86 }
    View Code

    POJ 2688 Cleaning Robot

    题意:有一个robot要清除地图上所有不干净的地方,问你最短路要多少。

    做法:bfs + TSP问题。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <vector>
     7 #include <queue>
     8 
     9 using namespace std;
    10 
    11 #define LL long long
    12 #define eps 1e-8
    13 #define inf 0x3f3f3f3f
    14 #define mod 1000
    15 #define MP make_pair
    16 #define mnx 25
    17 
    18 char ch[mnx][mnx];
    19 int dx[5] = { 0, 1, -1, 0 }, dy[5] = { 1, 0, 0, -1 };
    20 bool vis[mnx][mnx];
    21 struct node{
    22     int u, v, dis;
    23     node( int u = 0, int v = 0, int dis = 0 ) : u(u), v(v), dis(dis) {}
    24 };
    25 queue<node> q;
    26 int x[mnx], y[mnx], g[mnx][mnx], dis[mnx][mnx], cnt, n, m;
    27 bool in( int ax, int ay ){
    28     if( ax < 0 || ay < 0 || ax >= n || ay >= m || ch[ax][ay] == 'x' )
    29         return 0;
    30     return 1;
    31 }
    32 void bfs( int k, int cx, int cy ){
    33     memset( vis, 0, sizeof(vis) );
    34     vis[cx][cy] = 1;
    35     dis[k][k] = 0;
    36     q.push( node(cx, cy, 0) );
    37     while( !q.empty() ){
    38         node vv = q.front();
    39         int gx = vv.u, gy = vv.v, d = vv.dis;
    40         q.pop();
    41         for( int i = 0; i < 4; ++i ){
    42             int ax = gx + dx[i], ay = gy + dy[i];
    43             if( in( ax, ay ) && !vis[ax][ay] ){
    44                 if( g[ax][ay] != -1 )
    45                     dis[k][g[ax][ay]] = d + 1;
    46                 vis[ax][ay] = 1;
    47                 q.push( node(ax, ay, d+1) );
    48             }
    49         }
    50     }
    51 }
    52 int dp[15000][15];
    53 void solve(){
    54     for( int i = 0; i < cnt; ++i )
    55         bfs( i, x[i], y[i] );
    56     cnt--;
    57     for( int v = 0; v < (1<<cnt); ++v ){
    58         for( int i = 1; i <= cnt; ++i ){
    59             if( v & (1<<(i-1)) ){
    60                 if( v == (1<<(i-1)) )
    61                     dp[v][i] = dis[0][i];
    62                 else{
    63                     dp[v][i] = inf;
    64                     for( int j = 1; j <= cnt; ++j ){
    65                         if( v & (1<<(j-1)) && j != i )
    66                             dp[v][i] = min( dp[v][i], dp[v^(1<<(i-1))][j] + dis[j][i] );
    67                     }
    68                 }
    69             }
    70         }
    71     }
    72     int ans = inf;
    73     for( int i = 1; i <= cnt; ++i ){
    74         ans = min( dp[((1<<cnt)-1)][i], ans );
    75     }
    76     if( ans == inf ) puts( "-1" );
    77     else printf( "%d
    ", ans );
    78 }
    79 int main(){
    80     //freopen( "tt.txt", "r", stdin );
    81     while( scanf( "%d%d", &m, &n ) != EOF && ( m && n ) ){
    82         memset( g, -1, sizeof(g) );
    83         memset( dis, 0x3f, sizeof(dis) );
    84         cnt = 1;
    85         for( int i = 0; i < n; ++i ){
    86             scanf( "%s", ch[i] );
    87             for( int j = 0; j < m; ++j ){
    88                 if( ch[i][j] == '*' ){
    89                     x[cnt] = i, y[cnt] = j, g[i][j] = cnt++;
    90                 }
    91                 if( ch[i][j] == 'o' )
    92                     x[0] = i, y[0] = j, g[i][j] = 0;
    93             }
    94         }
    95         solve();
    96     }
    97     return 0;
    98 }
    View Code

    CodeForces 148D Bag of mice

    题意:有w个mice和b个mice,公主 和 龙 轮流摸,谁先摸到白的谁就赢,问你公主获胜的概率。龙每次摸完之后,如果没有赢的话,就会有一只mice会逃走(白色的或者黑色的)

    做法:dp[i][j]表示有i个白mice和j个黑mice,公主赢的概率。根据题意,公主赢的概率有3种情况。

    dp[i][j] = i*1.0 / sum; (当前公主赢的概率)
    dp[i][j] += ( dp[i-1][j-2] * (j/sum * (j-1.0)/(sum-1.0) * (i/(sum-2.0)) ) ); (龙没有赢,逃走的是白mice)
    dp[i][j] += ( dp[i][j-3] * (j/sum * (j-1.0)/(sum-1.0) * (j-2.0)/(sum-2.0) ) ); (龙没有赢,逃走的是黑mice)

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <vector>
     6 #include <algorithm>
     7 
     8 using namespace std;
     9 
    10 #define LL long long
    11 #define eps 1e-12
    12 #define lson l, m, rt<<1
    13 #define rson m+1, r, rt<<1|1
    14 #define mnx 1100
    15 #define Pi acos( -1.0 )
    16 
    17 double dp[mnx][mnx];
    18 int main(){
    19     for( int i = 1; i < mnx; ++i ){
    20         dp[i][0] = 1.0;
    21     }
    22     dp[1][1];
    23     int w, b;
    24     while( scanf( "%d%d", &w, &b ) != EOF ){
    25         for( int i = 1; i <= w; ++i ){
    26             for( int j = 1; j <= b; ++j ){
    27                 double sum = i + 0.0 + j;
    28                 dp[i][j] = i*1.0 / sum;
    29                 if( j >= 2 ){
    30                     dp[i][j] += ( dp[i-1][j-2] * (j/sum * (j-1.0)/(sum-1.0) * (i/(sum-2.0)) ) );
    31                 }
    32                 if( j >= 3 ){
    33                     dp[i][j] += ( dp[i][j-3] * (j/sum * (j-1.0)/(sum-1.0) * (j-2.0)/(sum-2.0) ) );
    34                 }
    35             }
    36         }
    37         printf( "%.10lf
    ", dp[w][b] );
    38     }
    39     return 0;
    40 }
    View Code

    HDU 1247 Hat’s Words

    题意:给你n个单词,问你这n个单词里面有哪些个是可以由两个单词组成的。

    做法:trie树 or 哈希。还以为单词很长,一个个分割会超时,没想到单词并不长。

     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 long
    11 #define eps 1e-8
    12 #define inf 0x3f3f3f3f
    13 #define mod 1000
    14 #define mnx 200100
    15 
    16 char ch[mnx][50];
    17 int son[mnx][26], cnt, val[mnx], all;
    18 void insert( char *s ){
    19     int m = strlen( s ), t = 0;
    20     for( int i = 0; i < m; ++i ){
    21         int c = s[i] - 'a';
    22         if( son[t][c] == 0 ){
    23             son[t][c] = ++cnt;
    24             memset( son[cnt], 0, sizeof(son[cnt]) );
    25             val[cnt] = 0;
    26         }
    27         t = son[t][c];
    28     }
    29     val[t] = 1;
    30 }
    31 bool find( char *s ){
    32     int m = strlen( s ), t = 0;
    33     for( int i = 0; i < m; ++i ){
    34         int c = s[i] - 'a';
    35         if( son[t][c] == 0 )
    36             return false;
    37         t = son[t][c];
    38     }
    39     return val[t];
    40 }
    41 char s[mnx];
    42 bool gao( int c, int u, int v ){
    43     int tot = 0;
    44     for( int i = u; i <= v; ++i ){
    45         s[tot++] = ch[c][i];
    46     }
    47     s[tot] = '';
    48    //cout << s << endl;
    49     if( find( s ) ) return 1;
    50     return 0;
    51 }
    52 int main(){
    53     cnt = all = 0;
    54     while( scanf( "%s", ch[all] ) != EOF ){
    55         insert( ch[all] );
    56         all++;
    57     }
    58     for( int i = 0; i < all; ++i ){
    59         int n = strlen( ch[i] );
    60         for( int j = 0; j < n-1; ++j ){
    61             if( gao( i, 0, j ) && gao( i, j + 1, n-1 ) ){
    62                 printf( "%s
    ", ch[i] ); break;
    63             }
    64         }
    65     }
    66     return 0;
    67 }
    View Code
  • 相关阅读:
    写在之前
    Fedora Core 3安装杂记(三)
    Fedora Core 3安装杂记(一)
    Firefox 1.0真的挺好用的
    发现Google加了英文页面翻译功能(Beta)
    Fedora Core 3安装杂记(四)
    在FC3的日子里……
    ASP面向对象编程探讨及比较
    显卡千万不能买带风扇的……
    字符串(strcat)
  • 原文地址:https://www.cnblogs.com/LJ-blog/p/4379694.html
Copyright © 2020-2023  润新知