zoukankan      html  css  js  c++  java
  • 2013 腾讯马拉松初赛第二场

    小Q系列故事——为什么时光不能倒流

      转换成秒后模拟即可

    View Code
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(){
        int T;
        scanf("%d", &T);
        while( T-- ){
            int h1,m1,s1;
            int h2,m2,s2;
            int mod = 12*60*60;    
            scanf("%d:%d:%d",&h1,&m1,&s1);
            scanf("%d:%d:%d",&h2,&m2,&s2);
            s1 = h1*3600+m1*60+s1;
            s2 = (h2*3600+m2*60+s2)%mod;
            
            s1 = (s1-s2+mod)%mod;
            h2 = s1/3600; m2 = (s1%3600)/60; s2 = s1%60;    
            printf("%02d:%02d:%02d\n", h2, m2, s2 );
    
        }
        return 0;
    }

    小明系列故事——女友的考验

      据说是 AC自动机,但是不会

    吉哥系列故事——完美队形I

      反置,对两串求 最长上升公共子序列,注意中间下标问题

    View Code
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <map>
    #include <set>
    #include <cmath>
    using namespace std;
    
    int seq[205], rseq[205], N;
    int f[205][205];
    
    inline int Min(int a, int b) {
        return a > b ? b : a;
    }
    
    inline int Max(int a, int b) {
        return a > b ? a : b;
    }
    
    void solve(int a[], int b[]) {
        int max;
        int Len = -1;
        int n1 = N, n2 = N;
        for(int i=1;i<=n1;i++)
        {
            max=0;
            for(int j=1;j<=n2;j++)
            {
                f[i][j]=f[i-1][j];
                if (a[i]>b[j]&&max<f[i-1][j]) {
                    max=f[i-1][j];
                }
                if (a[i]==b[j]) {
                    f[i][j]=max+1;
                    if (N-j+1 > i) {
                        Len = Max(Len, f[i][j]*2);
                    }
                    else if (N-j+1 == i){
                        Len = Max(Len, f[i][j]*2-1);
                    }
                }
            }
        }
        printf("%d\n", Min(Len, N));
    }
    
    int main() {
        int T;
        scanf("%d", &T);
        while (T--) {
            scanf("%d", &N);
            for (int i = 1; i <= N; ++i) {
                scanf("%d", seq+i);
                rseq[N-i+1] = seq[i];
            }
            solve(seq, rseq);
        }
        return 0;
    }

    吉哥系列故事——完美队形II

      分治+扩展KMP, 或者 另外一种处理字符串 M啥

    湫湫系列故事——设计风景线

      并查集+点分治 , 往上更新的时候合并子树,这样就不会超时

    View Code
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define MAX(a,b) (a)>(b)?(a):(b)
    const int N = 1e5+10;
    const int M = 1e6+10;
    
    int n, m;
    
    struct node{
        int v, c, nxt;
    }edge[M<<2];
    struct Edge{
        int u, v, c;
        void input(){
            scanf("%d%d%d",&u,&v,&c);    
            u--; v--;    
        }
    }Q[M];
    
    int head[N], idx;
    int st[N], dis[N];
    int res;
    bool vis[N];
    
    int find( int x ){
        return (x==st[x]) ? x : (st[x]=find(st[x])) ;
    }
    bool legal(){
        
        for(int i = 0; i < n; i++) st[i] = i;
        for(int i = 0; i < m; i++){
            int u = Q[i].u, v = Q[i].v;
            int x = find(u), y = find(v);
            if( x == y ) return false;
            else st[x] = y;
        } 
        return true;
    }
    void addedge(int u,int v,int c){
        edge[idx].v = v; edge[idx].c = c;
        edge[idx].nxt = head[u]; head[u] = idx++;
    
        edge[idx].v = u; edge[idx].c = c;
        edge[idx].nxt = head[v]; head[v] = idx++;
    }
    void dfs(int u,int pre ){
        if( !vis[u] ) vis[u] = true;
    
        for( int i = head[u]; ~i; i = edge[i].nxt ){    
            int v = edge[i].v;
            //printf("v = %d\n", v );    
            if( v != pre ){    
                dfs( v, u );
                res = MAX( res, dis[u]+dis[v]+edge[i].c );
    
                dis[u] = MAX( dis[u], dis[v]+edge[i].c );
            }
        } 
    }
    
    int solve(){
        memset( head, 0xff, sizeof(head));
        idx = 0;
        for(int i = 0; i < m; i++)
            addedge( Q[i].u, Q[i].v, Q[i].c );    
        
        res = 0;
        memset( vis, 0, sizeof(vis));
        memset( dis, 0, sizeof(dis));
        for(int i = 0; i < n; i++)
            if( !vis[i] ) dfs( i, -1 );
        return res;
    }
    int main(){
        while( scanf("%d%d",&n,&m) != EOF)
        {
            for(int i = 0; i < m; i++)
                Q[i].input();
            if( !legal() ) puts("YES");
            else    printf("%d\n", solve() );
        }
        return 0;
    }
  • 相关阅读:
    (21)tar打包命令详解
    (19)ln命令:在文件之间建立链接(硬链接和软链接)
    (20)打包(归档)和压缩概念
    (18)文件和目录管理类的常用命令3
    SSH 登录警告:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
    (17)文件和目录管理类的常用命令2
    (16)文件和目录管理类的常用命令1
    (15)Linux命令基本格式
    (14)Linux绝对路径和相对路径
    (13)Linux文件系统的优缺点
  • 原文地址:https://www.cnblogs.com/yefeng1627/p/2976453.html
Copyright © 2011-2022 走看看