130825周赛

比赛地址http://acm.bnu.edu.cn/bnuoj/contest_show.php?cid=2326#info

A。搜索

直接DFS找出3 ^ 10的状态,然后对于每个状态,求一次LIS,找出最大值。

B。给出一堆点,然后找到一个坐标,使得到达所有点的曼哈顿距离最小。

对这堆点的X坐标和Y坐标排序,找到X和Y的中位数,就是答案。

D。水题,模拟即可。

G,这题数据有点问题,抛开这个不讲,还卡精度。

最后double加了判精度才过。

#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Max 2505
#define ll long long
#define PI acos(-1.0)
#define inf 0x7fffffff
#define LL(x) ( x << 1 )
#define bug puts("here")
#define PII pair<int,int>
#define RR(x) ( x << 1 | 1 )
#define mp(a,b) make_pair(a,b)
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )
#define eps 1e-8

using namespace std;

inline void RD(int &ret) {
    char c;
    do {
        c = getchar();
    } while(c < '0' || c > '9') ;
    ret = c - '0';
    while((c=getchar()) >= '0' && c <= '9')
        ret = ret * 10 + ( c - '0' );
}

inline void OT(int a) {
    if(a >= 10)OT(a / 10) ;
    putchar(a % 10 + '0') ;
}
double fk[11][11] ;
int vis[11] ;
int num = 0 ;
void dfs(int now) {
    for (int i = 1 ; i <= num ; i ++ )if(!vis[i] && fk[now][i]) {
            vis[i] = 1 ;
            dfs(i) ;
        }
}
void floyd() {
    for (int k = 1 ; k <= num ; k ++ ) {
        for (int i = 1 ; i <= num ; i ++ ) {
            for (int j = 1 ; j <= num ; j ++ ) {
                if(fk[i][k] == inf || fk[k][j] == inf)continue ;
                fk[i][j] = min(fk[i][j] , fk[i][k] * fk[k][j]) ;
            }
        }
    }
}

string st[11] ;
int main() {
    int n ;
    int ca = 0 ;
    while(cin >> n , n) {
        map<string ,int>M ;
        mem(vis ,0 ) ;
        mem(fk ,0) ;
        num = 0 ;
        for (int i = 0 ; i < 11 ; i ++ ){
            for (int j = 0 ; j < 11 ; j ++ )fk[i][j] = inf ;
            fk[i][i] = 1 ;
        }
        for (int i = 0 ; i < n ; i ++ ) {
            int x , y ;
            string a , b ;
            char fkkk ;
            cin >> x >> a >> fkkk >> y >> b ;
            if(!M[a]) {
                M[a] = ++ num ;
                st[num] = a ;
            }
            if(!M[b]) {
                M[b] = ++ num ;
                st[num] = b ;
            }
            int aa = M[a] ;
            int bb = M[b] ;
            fk[aa][bb] = min(fk[aa][bb] , 1.0 * y / x) ;
            fk[bb][aa] = min(fk[bb][aa] , 1.0 * x / y) ;
        }
        int xx ;
        string AA ;
        cin >> xx >> AA ;
        floyd() ;
//        dfs(M[AA]) ;

        double ans = inf ;
        int pos = -1 ;
        int kk = 0 ;
        for (int i = 1 ; i <= num ; i ++ ) {
            if(fk[M[AA]][i] != inf && i != M[AA]) {
                int now = ceil(xx * 1.0 * fk[M[AA]][i] - eps) //eps不加就WA了
                double c = now * fk[i][M[AA]] ;
                if(now > 100000)continue ;
//                cout << c << endl;
                if(ans > c && c >= 0) {
                    ans = c ;
                    kk = now ;
                    pos = i ;
                }

//                cout << c << endl;
            }
        }
        printf("Case %d: %d %s\n",++ca ,kk ,st[pos].c_str()) ;
    }
    return 0 ;
}

H。

这里

你可能感兴趣的:(130825周赛)