zoukankan      html  css  js  c++  java
  • pat1021-1030

    1021求树的直径网上一搜就有,但是我不太理解 只需要一共求两次的dfs的论调,好吧我收回这句话,好想脑补了下,第一次dfs有多个最长点,只需要搜一个就行QAQ。这么看来我写麻烦了

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define MP(x, y) make_pair(x, y)
    #define FI first
    #define SE second
    const int INF = 0x3f3f3f3f;
    const int N = 1e4+5;
    
    int n;
    struct Node{
        int to, nx;
    }E[N*N*2];
    int head[N], tot;
    void add(int fr, int to) {
        E[tot].to = to; E[tot].nx = head[fr]; head[fr] = tot++;
    }
    int vis[N], dis[N];
    void dfs(int x) {
        for(int i = head[x]; ~i; i = E[i].nx) {
            int to = E[i].to;
            if(!vis[to]) {
                vis[to] = 1;
                dfs(to);
            }
        }
    }
    
    void bfs(int st) {
        queue<int> Q;
        memset(vis, 0, sizeof(vis));
        vis[st] = 1; dis[st] = 0;
        Q.push(st);
        while(!Q.empty()) {
            int x = Q.front(); Q.pop();
    
            for(int i = head[x]; ~i; i = E[i].nx) {
                int to = E[i].to;
                if(!vis[to]) {
                    vis[to] = 1;
                    dis[to] = dis[x]+1;
                    Q.push(to);
                }
            }
        }
    }
    void solve() {
        bfs(1);
        map<int, int> mp;
        map<int, int>::iterator it;
        int mx = -1;
        for(int i = 1; i <= n; ++i) {
            if(dis[i] > mx) {
                mx = dis[i];
            }
        }
        vector<int> doo;
        for(int i = 1; i <= n; ++i) {
            if(dis[i] == mx) {
                doo.push_back(i);
            }
        }
       // printf("%d
    ", mx);
       int cnt = 0;
        for(int i = 0; i < doo.size(); ++i) {
            cnt ++;
            if(cnt > 100) break;
            bfs(doo[i]);
            mp[doo[i]] ++;
            mx = -1;
            for(int j = 1; j <= n; ++j) {
                if(mx < dis[j]) {
                    mx = dis[j];
                }
            }
            for(int j = 1; j <= n; ++j) {
                if(dis[j] == mx) {
                    mp[j] ++;
                }
            }
        }
    
        for(it = mp.begin(); it != mp.end(); ++it) {
          //  if(it != mp.begin()) printf(" ");
            printf("%d
    ", it->first);
        }
       // printf("
    ");
    }
    int main() {
        while(~scanf("%d", &n)) {
            memset(head, -1, sizeof(head)); tot = 0;
    
            for(int i = 1; i < n; ++i) {
                int a,b; scanf("%d %d", &a, &b);
                add(a, b); add(b, a);
            }
    
            int cnt = 0;
            memset(vis, 0, sizeof(vis));
            for(int i = 1; i <= n; ++i) {
                if(!vis[i]) {
                    vis[i] = 1;
                    dfs(i);
                    cnt ++;
                }
            }
            if(cnt > 1) {
                printf("Error: %d components
    ", cnt); continue;
            }
         //   printf("%d
    ", cnt);
            solve();
        }
        return 0;
    }

    1022 模拟一下就行

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define MP(x, y) make_pair(x, y)
    #define FI first
    #define SE second
    
    map<string, vector<int> > title;
    map<string, vector<int> > author;
    map<string, vector<int> > publish;
    map<string, vector<int> > keyword;
    map<string, vector<int> > year;
    
    int main() {
        int n;
        while(~scanf("%d", &n)) {
            title.clear();
            author.clear();
            publish.clear();
            keyword.clear();
            year.clear();
    
            char tmp[100];
            for(int i = 0; i < n; ++i) {
                int id; scanf("%d", &id);
                getchar();
                gets(tmp); title[tmp].push_back(id);
             //   printf("%s
    ", tmp);
    
                gets(tmp); author[tmp].push_back(id);
    
                gets(tmp);
                int len = strlen(tmp);
                string tt; tt.clear();
                for(int j = 0; j <= len; ++j) {
                    if( tmp[j] == '
    ' || tmp[j] == ' ' || !tmp[j] ) {
                        keyword[tt].push_back(id);
                        tt.clear();
                    }else tt += tmp[j];
                }
    
                gets(tmp); publish[tmp].push_back(id);
                gets(tmp); year[tmp].push_back(id);
            }
    
            int m; scanf("%d", &m);
            getchar();
            for(int i = 0; i < m; ++i) {
                gets(tmp);
                int len = strlen(tmp);
                int ch = tmp[0]-'0';
                for(int j = 0; j < len; ++j) {
                    tmp[j] = tmp[j+3];
                }
                tmp[len-3] = 0;
                printf("%d: %s
    ", ch, tmp);
                int fl = 0;
                if(ch == 1) {
                    sort(title[tmp].begin(), title[tmp].end());
                    for(int j = 0; j < title[tmp].size(); ++j) {
                        printf("%07d
    ", title[tmp][j]); fl = 1;
                    }
                }else if(ch == 2) {
                    sort(author[tmp].begin(), author[tmp].end());
                    for(int j = 0; j < author[tmp].size(); ++j) {
                        printf("%07d
    ", author[tmp][j]); fl = 1;
                    }
                }else if(ch == 3) {
                    sort(keyword[tmp].begin(), keyword[tmp].end());
                    for(int j = 0; j < keyword[tmp].size(); ++j) {
                        printf("%07d
    ", keyword[tmp][j]); fl = 1;
                    }
                }else if(ch == 4) {
                    sort(publish[tmp].begin(), publish[tmp].end());
                    for(int j = 0; j < publish[tmp].size(); ++j) {
                        printf("%07d
    ", publish[tmp][j]); fl = 1;
                    }
                }else {
                    sort(year[tmp].begin(), year[tmp].end());
                    for(int j = 0; j < year[tmp].size(); ++j) {
                        printf("%07d
    ", year[tmp][j]); fl = 1;
                    }
                }
                if(!fl) printf("Not Found
    ");
            }
        }
        return 0;

    1023 没啥好说

    #include<bits/stdc++.h>
    using namespace std;
    #define sz(X) ((int)X.size())
    typedef long long ll;
    const int INF = 0x3f3f3f3f;
    const int N = 1e4+5;
    #define MP(x, y) make_pair<x, y>
    
    char s[30];
    char b[30];
    char a[30];
    int main() {
      while(~scanf("%s", s)) {
        int len = strlen(s);
        int pre = 0;
        for(int i = len-1; i >= 0; --i) {
          int tt = (s[i]-'0') * 2 + pre;
          if(tt >= 10) {
            int tmp = tt;
            tt = tmp%10;
            pre = tmp/10;
          }else pre = 0;
          b[i] = tt+'0';
        }
    
    //    for(int i = 0; i < len; ++i) printf("%c", b[i]); printf("
    ");
        int ok = 0;
        if(pre) printf("No
    ");
        else {
          for(int i = 0; i < len; ++i) {
            a[i] = b[i];
          }
          sort(a, a+len);
          sort(s, s+len);
          int fl = 1;
          for(int i = 0; i < len; ++i) {
            if(a[i] != s[i]) {
              fl = 0; break;
            }
          }
    
          if(!fl) printf("No
    ");
          else {
            printf("Yes
    "); ok = 1;
            for(int j = 0; j < len; ++j) printf("%c", b[j]);
            printf("
    ");
          }
        }
    
        if(!ok) {
          if(pre) printf("%d",pre);
          for(int i = 0; i < len; ++i) printf("%c", b[i]);
          printf("
    ");
        }
    
      }
      return 0;
    }

    1024 不敢乱讲,但是这题好想真的数据范围不对,按照题意不可能超ll的吧,,之后改了就对了

    #include<bits/stdc++.h>
    using namespace std;
    #define MP(x, y) make_pair(x, y)
    #define FI first
    #define SE second
    const int INF = 0x3f3f3f3f;
    const int N = 1e4+5;
    typedef long long ll;
    
    int n[50]; int len;
    char s[50];
    int tmp[50];
    void Print() {
        for(int i = 0; i < len; ++i) printf("%d", n[i]);
    }
    int main() {
        int k;
        while(~scanf("%s %d", s, &k)) {
            len = strlen(s);
            for(int i = 0; i < len; ++i) n[i] = s[i]-'0';
    
            int fl = 1;
            for(int i = 0; i < len/2; ++i) {
                if(n[i] != n[len-1-i]) {
                    fl = 0; break;
                }
            }
            if(fl) {
                Print(); printf("
    0
    ");
                continue;
            }
    
            for(int i = 1; i <= k; ++i) {
                int pre = 0;
                for(int j = len-1; j >= 0; --j) {
                    tmp[j] = n[j]+n[len-1-j]+pre;
                    if(tmp[j] >= 10) {
                        tmp[j] -= 10;
                        pre = 1;
                    }else pre = 0;
                }
    
                int cnt = 0;
                if(pre) n[cnt++] = pre;
                for(int j = 0; j < len; ++j) {
                    n[cnt++] = tmp[j];
                }
                len = cnt;
    
                int fl = 1;
                for(int j = 0; j < len/2; ++j) {
                    if(n[j] != n[len-1-j]) {
                        fl = 0; break;
                    }
                }
                if(fl || i == k) {
                    Print(); printf("
    %d
    ",i);
                    break;
                }
            }
        }
        return 0;
    }

    1025 模拟

    #include<bits/stdc++.h>
    using namespace std;
    #define MP(x, y) make_pair(x, y)
    #define FI first
    #define SE second
    const int INF = 0x3f3f3f3f;
    const int N = 1e4+5;
    typedef long long ll;
    
    struct Node{
        ll s; int grade; int loc; int locrank; int allrank;
    }E[30005];
    int tot;
    int pretot;
    int cmp(Node a, Node b) {
        if(a.grade != b.grade) return a.grade > b.grade;
        else return a.s < b.s;
    }
    int main() {
        int n;
        while(~scanf("%d", &n)) {
            pretot = 1; tot = 0;
            for(int i = 1; i <= n; ++i) {
                int k; scanf("%d", &k);
                for(int j = 0; j < k; ++j) {
                    ++tot; scanf("%lld %d", &E[tot].s, &E[tot].grade);
                //    printf("%s
    ", E[tot].s);
                    E[tot].loc = i;
                }
                sort(E+pretot, E+tot+1, cmp);
                for(int j = pretot; j <= tot; ++j) {
                    if(j != pretot && E[j].grade == E[j-1].grade) {
                        E[j].locrank = E[j-1].locrank;
                    }else E[j].locrank = j-pretot+1;
                }
                pretot = tot+1;
            }
            sort(E+1, E+tot+1, cmp);
            for(int i = 1; i <= tot; ++i) {
                if(i != 1 && E[i].grade == E[i-1].grade) {
                    E[i].allrank = E[i-1].allrank;
                }else E[i].allrank = i;
            }
    
            printf("%d
    ", tot);
            for(int i = 1; i <= tot; ++i) {
                printf("%013lld %d %d %d
    ", E[i].s, E[i].allrank, E[i].loc, E[i].locrank);
            }
        }
        return 0;
    }

    1026做了半天,因为之前一直想按照前面几个题目的做法,直接对人来的时间进行排序。这题我是按照时间点进行处理,桌子来,或者人来都是时间点,对于每个时间点单独处理。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <ctime>
    #include <algorithm>
    #include <iostream>
    #include <map>
    #include <set>
    #include <queue>
    #include <cmath>
    using namespace std;
    const int N = 1e4+5;
    const int INF = 0x3f3f3f3f;
    
    struct Node{
      int come;
      int serve;
      int cost;
      int vip;  
      int vis;
      int id;
    }E[N];
    int cmp(Node a, Node b) {
      return a.come < b.come;
    }
    int cmp2(Node a, Node b) {
      return a.serve < b.serve;
    }
    int V[105];
    int ans[105];
    struct Pode{
      int pos, tim, type, vip;
      Pode(int a=0, int b=0, int c=0, int d=0):pos(a), tim(b), type(c), vip(d){}
      bool operator <(const Pode &T) const {
        if(tim != T.tim) return tim > T.tim;
        else if(type != T.type) return type > T.type;
        else if(vip != T.vip) return vip > T.vip;
        else return pos > T.pos;
      }
    };
    
    
    set<int> table;
    set<int> vtable;
    set<int> person;
    set<int> vperson;
    priority_queue<Pode> Q;
    
    void solve(int nwtime) {
      if(vperson.size() > 0 && vtable.size() > 0) {
        int per = *vperson.begin();
        E[per].serve = nwtime;
        int ta = *vtable.begin();
    
        Q.push(Pode(ta, nwtime+E[per].cost, 0, V[ta]));
    
        vperson.erase(per); person.erase(per);
        vtable.erase(ta);  table.erase(ta);
        if(nwtime < 21*3600) ans[ta] ++;
        return;
      }
    
      int per = *person.begin();
      E[per].serve = nwtime;
      int ta = *table.begin();
      Q.push(Pode(ta, nwtime+E[per].cost, 0, V[ta]));
    
      vperson.erase(per); person.erase(per);
      vtable.erase(ta);   table.erase(ta);
      if(nwtime < 21*3600) ans[ta] ++;
    }
    void put(int x) {
      printf("%02d:%02d:%02d ", x/3600, (x%3600)/60, x%60);
    }
    int main() {
      int n;
      int k, m;
      while(~scanf("%d", &n)) {
        memset(ans, 0, sizeof(ans));
        memset(V, 0, sizeof(V));
        while(!Q.empty()) Q.pop();
        table.clear();
        vtable.clear();
        person.clear();
        vperson.clear();
    
        for(int i = 1; i <= n; ++i) {
          int a, b, c;
          scanf("%d:%d:%d %d %d", &a, &b, &c, &E[i].cost, &E[i].vip);
          E[i].come = a*3600 + b*60 + c;
          E[i].cost = min(120, E[i].cost);
          E[i].cost = E[i].cost*60;
          E[i].id = i;
          E[i].vis = 0;
        }  
        sort(E+1, E+n+1, cmp);
        scanf("%d %d", &k, &m);
        for(int i = 0; i < m; ++i) {
          int a; scanf("%d", &a);
          V[a] ++;
        }
        for(int i = 1; i <= k; ++i) Q.push(Pode(i, 8*3600, 0, V[i]));
    
        for(int i = 1; i <= n; ++i) Q.push(Pode(i, E[i].come, 1, E[i].vip));
    
        while(!Q.empty()) {
          Pode tt = Q.top(); Q.pop();
          int id = tt.pos; int nwtime = tt.tim; int ty = tt.type;
        //  printf("%d %d %d
    ", id, nwtime, ty);
          if(tt.type == 0) {
            table.insert(id);
            if(V[id]) vtable.insert(id);
            if(table.size() > 0 && person.size() > 0) solve(nwtime);
          }else {
            person.insert(id);
            if(E[id].vip) vperson.insert(id);
            if(table.size() > 0 && person.size() > 0) solve(nwtime);
          }
        }
        sort(E+1, E+n+1, cmp2);
    
        for(int i = 1; i <= n; ++i) {
          if(E[i].serve >= 21*3600) break;
          put(E[i].come); put(E[i].serve);
        //  printf("%.3f
    ", (E[i].serve-E[i].come)/60.0);
          printf("%.f
    ", round((E[i].serve-E[i].come)/60.0));
        }
        for(int i = 1; i <= k; ++i) {
          if(i != 1) printf(" ");
          printf("%d", ans[i]);
        }
        printf("
    ");
      }
      return 0;
    }

    1027

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<time.h>
    #include<stdlib.h>
    #include<map>
    #include<cstdio>
    using namespace std;
    const int N = 1e6+5;
    #define mp(A,B) make_pair(A,B)
    
    void put(int x) {
      int t[3]; int c = 0;
      memset(t, 0, sizeof(t));
      while(x) {
        t[c++] = x%13;
        x /= 13;  
      }
    
      if(t[1] >= 10) printf("%c", t[1]-10+'A');
      else printf("%d", t[1]);
    
      if(t[0] >= 10) printf("%c", t[0]-10+'A');
      else printf("%d", t[0]);
    }
    
    int main () {
      int a, b, c;
      while(~scanf("%d %d %d",&a,&b,&c)) {
        printf("#");
    
        put(a); put(b); put(c);
    
      }
      return 0;
    }

    1028

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 1e6+5;
    
    struct Node{
      int id;
      char name[20];
      int grade;
    }E[N];
    int n, c;
    int cmp(Node a, Node b)  {  
      if(c == 1) return a.id < b.id;
      else if(c == 2) {
        int l1 = strlen(a.name); int l2 = strlen(b.name);
    
        for(int i = 0; i < min(l1, l2); ++i) {
          if(a.name[i] != b.name[i]) 
            return a.name[i] < b.name[i];
        }
        if(l1 != l2) return l1 < l2;
      }else if(a.grade != b.grade) return a.grade < b.grade;    
      return a.id < b.id;
    }
    int main() {
      while(~scanf("%d %d", &n, &c)) {
        for(int i = 1; i <= n; ++i) {
          scanf("%d %s %d", &E[i].id, E[i].name, &E[i].grade);
        }
        sort(E+1, E+n+1, cmp);
    
        for(int i = 1; i <= n; ++i) {
          printf("%06d %s %d
    ", E[i].id, E[i].name, E[i].grade);
        }
    
      }
      return 0;
    }

    1029 查找中位数算法,算法导论上有

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<ctime>
    #include<cstdlib>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 2e6+5;
    typedef long long ll;
    
    ll a[N];
    
    
    int rand_partion(int l, int r) {
      int randnum = (rand()%(r-l+1)) + l;
    //  printf("%d
    ", randnum);
      swap(a[r], a[randnum]);
    
      int fl = l-1;
      int tag = a[r];
      for(int i = l; i < r; ++i) {
        if(a[i] <= tag) {
          fl ++;
          swap(a[fl], a[i]);
        }
      }
      swap(a[fl+1], a[r]);
      return fl+1;
    }
    ll getMid(int l, int r, int tar) {
    //  printf("%d %d %d
    ", l, r, tar);
      if(l == r) return a[l];
    
      int po = rand_partion(l, r);
    //  printf("%d:",po);
    //  for(int i = l; i <= r; ++i) printf("%lld ", a[i]); printf("
    ");
    
      int len = po-l+1;
      if(tar == len) return a[po];
      else if(tar < len) return getMid(l, po-1, tar);
      else return getMid(po+1, r, tar-len);
    }
    int main() {
      int n;
      srand(time(NULL));
      while(~scanf("%d", &n)) {
        for(int i = 1; i <= n; ++i) {
          scanf("%lld", &a[i]);
        }
        int m; scanf("%d", &m);
        for(int i = 1; i <= m; ++i) {
          scanf("%lld", &a[i+n]);
        }
        n = n+m;
      //  printf("%d
    ", n);
        printf("%lld
    ", getMid(1, n, (n+1)/2) );
      }
      return 0;
    }

    1030 双参数最短路,水一水

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 505;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    int n,m,s,d;
    struct Node{
      int to, nx, dis, cost;
    }E[N*N*2];
    int head[N], tot;
    void add(int fr, int to, int dis, int cost) {
      E[tot].to = to; E[tot].dis = dis; E[tot].cost = cost;
      E[tot].nx = head[fr]; head[fr] = tot++;
    }
    struct Hode{
      int pos, dis, cost;
      Hode(int a=0, int b=0, int c=0):pos(a),dis(b),cost(c){}
      bool operator < (const Hode &T) const {
        if(dis != T.dis) return dis > T.dis;
        else return cost > T.cost;
      }
    };
    int _dis[N], _cost[N], pre[N], vis[N];
    void dijkstra(int x) {
      priority_queue<Hode> Q;
      memset(vis, 0, sizeof(vis));
      memset(_dis, INF, sizeof(_dis));
      memset(_cost, INF, sizeof(_cost));
      _dis[s] = 0, _cost[s] = 0;
      Q.push(Hode(s, _dis[s], _cost[s]));
    
      while(!Q.empty()) {
        Hode top = Q.top(); Q.pop();
        int x = top.pos; int dis = top.dis; int cost = top.cost;
        if(vis[x]) continue;
        vis[x] = 1;
        for(int i = head[x]; ~i; i = E[i].nx) {
          int to = E[i].to;
    
          if(_dis[to] > _dis[x] + E[i].dis) {
            _dis[to] = _dis[x] + E[i].dis;
            _cost[to] = _cost[x] + E[i].cost;
            Q.push(Hode(to, _dis[to], _cost[to]));
            pre[to] = x;
          }else if(_dis[to] == _dis[x] + E[i].dis && _cost[to] > _cost[x] + E[i].cost) {
            _cost[to] = _cost[x] + E[i].cost;
            Q.push(Hode(to, _dis[to], _cost[to]));
            pre[to] = x;
          }
        }
      }
    }
    void dfs(int x) {
      if(x == s) {
        printf("%d ", s); return;
      }
      dfs(pre[x]);
      printf("%d ", x);
    }
    int main() {
      while(~scanf("%d %d %d %d", &n, &m, &s, &d)) {
        memset(head, -1, sizeof(head)); tot = 0;
        for(int i = 0; i < m; ++i) {
          int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d);
          add(a, b, c, d); 
          add(b, a, c, d);
        }
      //  printf("hh
    ");
        dijkstra(s);
        dfs(d);
        printf("%d %d
    ", _dis[d], _cost[d]);
      }
      return 0;
    }
  • 相关阅读:
    一台计算机安装两个版本的MySQL
    用php实现显示上个月的最后一天
    SQL 如何去掉字段中千位的逗号(比如set @= '1,320.00' 想得到@= '1320.00' )
    jsp表单提交中的逻辑判断
    将两个字段中的值合并到一个字段中
    vue判断开始日期不能大于截至日期
    mySql中The user specified as a definer ('root'@'%') does not exist
    mysql GROUP_CONCAT给每个值加上单引号后再拼接
    javascript如何获取复选框中的值?
    mybatis中的useGeneratedKeys="true"
  • 原文地址:https://www.cnblogs.com/Basasuya/p/8433711.html
Copyright © 2011-2022 走看看