zoukankan      html  css  js  c++  java
  • COJ 1692:模拟

    感觉有点难写。。模拟都这样

    直接暴力每一个点的轨迹,看看最多能过几个点就行了

    问题就在于每一个点经过之后会消失,所以我们需要处理一下

    我的处理方法是对于每一个点,用set维护它所能到达的点以及两点间的距离,并且按距离排序,距离短的点先消失

    #include"cstdio"
    #include"queue"
    #include"cmath"
    #include"stack"
    #include"iostream"
    #include"algorithm"
    #include"cstring"
    #include"queue"
    #include"map"
    #include"set"
    #include"vector"
    #define LL long long
    #define mems(a,b) memset(a,b,sizeof(a))
    #define ls pos<<1
    #define rs pos<<1|1
    #define max(a,b) (a)>(b)?(a):(b)
    using namespace std;
    
    const int N = 3005;
    const int MAXN = 200;
    const int INF = 0x3f3f3f3f;
    
    struct node{
        int x,y;
        char d[2];
    }p[N];
    
    set<pair<int,int> > G[N];
    int vis[N],cnt;
    
    void check(int i,int j){
        if(p[i].x!=p[j].x&&p[i].y!=p[j].y) return ;
        if(p[i].x==p[j].x){
            if(p[i].y<p[j].y){
                if(p[i].d[0]=='v') G[i].insert(make_pair(p[j].y-p[i].y,j));
                if(p[j].d[0]=='^') G[j].insert(make_pair(p[j].y-p[i].y,i));
            }
            else{
                if(p[i].d[0]=='^') G[i].insert(make_pair(p[i].y-p[j].y,j));
                if(p[j].d[0]=='v') G[j].insert(make_pair(p[i].y-p[j].y,i));
            }
        }
        else{
            if(p[i].x<p[j].x){
                if(p[i].d[0]=='>') G[i].insert(make_pair(p[j].x-p[i].x,j));
                if(p[j].d[0]=='<') G[j].insert(make_pair(p[j].x-p[i].x,i));
            }
            else{
                if(p[i].d[0]=='<') G[i].insert(make_pair(p[i].x-p[j].x,j));
                if(p[j].d[0]=='>') G[j].insert(make_pair(p[i].x-p[j].x,i));
            }
        }
    }
    
    void dfs(int u){
        cnt++;
        vis[u]=1;
        if(G[u].empty()) return;
        set<pair<int,int> >::iterator it;
        for(it=G[u].begin();it!=G[u].end();it++) if(!vis[(*it).second]) break;
        if(it!=G[u].end()) dfs((*it).second);
    }
    
    int main(){
        int n;
        while(~scanf("%d",&n)){
            for(int i=0;i<n;i++) G[i].clear();
            for(int i=0;i<n;i++) scanf("%d%d%s",&p[i].x,&p[i].y,p[i].d);
            for(int i=0;i<n;i++)
            for(int j=0;j<i;j++) check(i,j);
            int ans=1;
            for(int i=0;i<n;i++){
                cnt=0;
                mems(vis,0);
                dfs(i);
                ans=max(ans,cnt);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    UITableView学习笔记
    IOS基础之设置APP的名字、设置图标、添加等待加载时的图片
    UIScrollView,UIPageControl
    UIPickerView基本用法
    最大公约数和最小公倍数
    快速幂、快速乘
    素数筛
    最小生成树
    BZOJ1070 [SCOI2007]修车
    BZOJ1109 [POI2007]堆积木Klo
  • 原文地址:https://www.cnblogs.com/luxiaoming/p/5276840.html
Copyright © 2011-2022 走看看