zoukankan      html  css  js  c++  java
  • pat1051-1060

    1051 自己写的非常麻烦
    http://blog.csdn.net/biaobiaoqi/article/details/9338397
    的算法比较好,我的就贴下吧,主要对入栈出栈不够理解

    #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 = 1e3+5;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    int m,n,l;
    int a[N];
    int vis[N];
    
    int tree[N];
    void add(int pos, int num) {
      for(int i = pos; i <= n; i += i&-i) {
        tree[i] += num;
      }
    }
    int sum(int pos) {
      int ans = 0;
      for(int i = pos; i; i -= i&-i) {
        ans += tree[i];
      }
      return ans;
    }
    
    
    int main() {
      while(~scanf("%d %d %d", &m, &n, &l)) {
        a[0] = 0;
        for(int i = 1; i <= l; ++i) {
          for(int j = 1; j <= n; ++j) {
            scanf("%d", &a[j]);    
            vis[j] = 0;
            tree[j] = 0;
          }
    
          int fl = 1; 
    
    
    //      for(int j = 1; j <= n; ++j) printf("%d ", a[j]); printf("
    ");
          for(int j = 1; j <= n; ++j) {
          //  printf("%d ", vis[a[j]]);
          //  printf("hh
    ");
        //    if(vis[a[j]]) continue;
        //    vis[a[j]] = 1;
            vector<int> vc; vc.clear();
            vc.push_back(a[j]);
          //  printf("hh
    ");
            for(int k = j+1; k <= n; ++k) {
              if(a[k] < a[j]) {
              //  vis[a[k]] = 1;
                vc.push_back(a[k]);
              }
            }
          //  printf("hh
    ");
          //  for(int k = 0; k < vc.size(); ++k) printf("%d ", vc[k]); printf("
    ");
            for(int k = 0; k < (int)vc.size()-1; ++k) {
            //  printf("%d %d
    ", vc[k], vc[k-1]);
              if(vc[k] < vc[k+1]) {
                fl = 0; break;
              }
            }
          //  printf("%d
    ", fl);
          }
      //    for(int j = 1; j <= n; ++j) printf("%d ",a[j]); printf("
    "); 
    
        //  printf("%d
    ", fl);
          for(int j = 1; j <= n; ++j) {
            int tt = a[j] - sum(a[j]);
          //  printf("%d
    ", tt);
            add(a[j], 1);
            if(tt > m) {
            //  printf("%d %d
    ", i, tt);
              fl = 0; break;
            }
          }
    
    
          if(fl) printf("YES
    ");
          else printf("NO
    ");
        }
    
      }
      return 0;
    }

    1052 这题其实也不难,但是错了n发以后心态就崩了。不考虑边界,代码改进没有做足,反正比较毛躁

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<ctime>
    #include<cstdlib>
    #include<map>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 1e5+5;
    typedef long long ll;
    #define MP(x, y) make_pair(x, y);
    
    int n, head;
    
    struct Node{
      int pos, value;
    }E[N];
    int tot;
    int cmp(Node a, Node b) {
      return a.value < b.value;
    }
    
    
    
    int key[N]; int nx[N];
    
    int main() {
      while(~scanf("%d %d", &n, &head)) {
        tot = 0;
        memset(key, INF, sizeof(key));
    
        for(int i = 0; i < n; ++i) {
          int a, b, c; scanf("%d %d %d", &a, &b, &c);
          key[a] = b;  nx[a] = c;
        }
        if(head == -1) {
          printf("0 -1
    "); continue;
        }
    
        int x = head;
        while(x != -1) {
          E[++tot].pos = x;
          E[tot].value = key[x];
    
          x = nx[x];
        }
    
    
      //  while(1);
        sort(E+1, E+tot+1, cmp);
    
        printf("%d %05d
    ", tot, E[1].pos);
        for(int i = 1; i <= tot; ++i) {
          printf("%05d %d ", E[i].pos, E[i].value);
    
          if(i == tot) printf("-1
    ");
          else printf("%05d
    ", E[i+1].pos);
        }  
      }
      return 0;
    }

    1053

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<ctime>
    #include<cstdlib>
    #include<map>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 105;
    typedef long long ll;
    #define MP(x, y) make_pair(x, y);
    
    int n, m, s;
    int wei[N];
    
    struct Node{
      int to, nx;
    }E[N];
    int head[N], tot;
    void add(int fr, int to) {
      E[tot].to = to; E[tot].nx = head[fr]; head[fr] = tot++;
    }
    vector<int> vc;
    vector<vector<int> > v2;
    int leaf[N];
    
    void dfs(int x, int Wei) {
      vc.push_back(wei[x]);
    //  printf("%d %d
    ", x);
      if(Wei == s && !leaf[x]) {
      //  printf("%d
    ", x);
        v2.push_back(vc);
      }
    
    //  vc.push_back(wei[x]);
      for(int j = head[x]; ~j; j = E[j].nx) {
        int to = E[j].to;
        dfs(to, Wei+wei[to]);
      }
    
      vc.erase(--vc.end());
    }
    int cmp(vector<int> a, vector<int> b) {
      int l1 = a.size(); int l2 = b.size();
    
      for(int i = 0; i < min(l1, l2); ++i) {
        if(a[i] != b[i])
           return a[i] > b[i];  
      }
    }
    int main() {  
      while(~scanf("%d %d %d", &n, &m, &s)) {
        memset(leaf, 0, sizeof(leaf));
        memset(head, -1, sizeof(head)); tot = 0;
    
        for(int i = 0; i < n; ++i) scanf("%d", &wei[i]);
    
        for(int i = 0; i < m; ++i) {
          int a, b; scanf("%d %d", &a, &b);
          leaf[a] = 1;
          for(int j = 0; j < b; ++j) {
            int c; scanf("%d", &c);
            add(a, c);
          }  
        }  
    
        vc.clear(); v2.clear();
      //  printf("hh
    ");
        dfs(0, wei[0]);
      //  printf("hh
    ");
    
        sort(v2.begin(), v2.end(), cmp);
        for(int i = 0; i < v2.size(); ++i) {
          for(int j = 0; j < v2[i].size(); ++j) {
            if(j) printf(" ");
            printf("%d", v2[i][j]);
          }
          printf("
    ");
        }
      }
      return 0;
    }

    1054

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<ctime>
    #include<cstdlib>
    #include<map>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 105;
    typedef long long ll;
    #define MP(x, y) make_pair(x, y);
    
    map<int, int> mp;
    map<int, int> ::iterator it;
    int main() {
      int n, m;
      while(~scanf("%d %d", &n, &m)) {
        mp.clear();
        for(int i = 1; i <= n; ++i) {
          for(int j = 1; j <= m; ++j) {
            int a; scanf("%d", &a);
            mp[a] ++;
          }
        }
    
        int maxn = -1; int maxp;
        for(it = mp.begin(); it != mp.end(); ++it) {
          if(maxn < it->second) {
            maxn = it->second; maxp = it->first;
          }
        }
    
        printf("%d
    ", maxp);
      }
      return 0;
    }

    1055 这题为什么正确率那么低,我是水过的喽 = =

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<ctime>
    #include<cstdlib>
    #include<map>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 1e5+5;
    typedef long long ll;
    #define MP(x, y) make_pair(x, y);
    
    char nam[N][10];  
    struct Node{
      int namid, age, net;
      bool operator < (const Node &T) const {
        if(net != T.net) return net > T.net;
        else if(age != T.age) return age < T.age;
        else {
          int l1 = strlen(nam[namid]);
          int l2 = strlen(nam[T.namid]);
          for(int i = 0; i < min(l1, l2); ++i) {
            if( nam[namid][i] != nam[T.namid][i] ) {
              return nam[namid][i] < nam[T.namid][i];  
            }
          }
          return l1 < l2;
        }
      }
    }E[N];
    
    int main() {
      int n, k;
      while(~scanf("%d %d", &n, &k)) {
        for(int i = 0; i < n; ++i) {
          int a, b;
          scanf("%s %d %d", nam[i], &a, &b);
          E[i].namid = i; E[i].age = a; E[i].net = b;
        }
        sort(E, E+n);
    
        for(int i = 1; i <= k; ++i) {
          int a, b, c; scanf("%d %d %d", &a, &b, &c);
          printf("Case #%d:
    ", i);
          int cnt = 0;
          for(int j = 0; j < n; ++j) {
            if(E[j].age >= b && E[j].age <= c) {
              printf("%s %d %d
    ", nam[E[j].namid], E[j].age, E[j].net);
              cnt ++;
              if(cnt == a) break;
            }
          }
          if(cnt == 0) printf("None
    ");
        }
      }
      return 0;
    }

    1056

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<ctime>
    #include<cstdlib>
    #include<map>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 1e3+5;
    typedef long long ll;
    #define MP(x, y) make_pair(x, y);
    
    int w[N];
    int order[N];
    vector<int> vc;
    struct Node{
      int gra; int pos;
    }E[N];
    int cmp(Node a, Node b) {
      return a.gra > b.gra;
    }
    int ans[N];
    int np, ng;
    
    
    void solve() {
      int flor = 0;
      while(vc.size() != 1) {
        ++flor;
        vector<int> tmp; vector<int> nx;
        for(int i = 0; i < vc.size(); ++i) {
          tmp.push_back(vc[i]);
          if(tmp.size() == ng) {
            int maxn = -1; int maxp;
            for(int j = 0; j < tmp.size(); ++j) {
              E[tmp[j]].gra = flor;
              if(maxn < w[tmp[j]]) {
                maxn = w[tmp[j]]; maxp = tmp[j];
              }
            }
            nx.push_back(maxp);
            tmp.clear();
          }
        }
        int maxn = -1; int maxp;
        if(tmp.size() > 0) {
          for(int j = 0; j < tmp.size(); ++j) {
            E[tmp[j]].gra = flor;
            if(maxn < w[tmp[j]]) {
              maxn = w[tmp[j]]; maxp = tmp[j];
            }
          }
          nx.push_back(maxp);
        }
        vc.clear();
        for(int i = 0; i < nx.size(); ++i) vc.push_back(nx[i]);
      }
      ++flor; E[vc[0]].gra = flor;
    }
    int grade[N];
    int main() {
      while(~scanf("%d %d", &np, &ng)) {
        vc.clear();
        for(int i = 0; i < np; ++i) E[i].pos = i;
        for(int i = 0; i < np; ++i) scanf("%d", &w[i]);
        for(int i = 0; i < np; ++i) {
          scanf("%d", &order[i]);
          vc.push_back(order[i]);
        }
    
        solve();
        sort(E, E+np, cmp);
    
        for(int i = 0; i < np; ++i) {
          if(!i || E[i].gra != E[i-1].gra) ans[E[i].pos] = i+1;
          else ans[E[i].pos] = ans[E[i-1].pos];
        }
        for(int i = 0; i < np; ++i) {
          if(i) printf(" ");
          printf("%d", ans[i]);
        }
        printf("
    ");
      }
      return 0;
    }

    1057 难点在于 中位数怎么做,我用了两个multiset维护,那个中位数会出现在第一个set的最后一个,就是说两个set保存前一半,后一半

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<ctime>
    #include<cstdlib>
    #include<map>
    #include<set>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 1e3+5;
    typedef long long ll;
    #define MP(x, y) make_pair(x, y);
    
    vector<int> vc;
    multiset<int> s1, s2;
    multiset<int> ::iterator it;
    
    void adjust() {
      if(s1.size() > 0 && s2.size() > 0) {
        int t1 = *(--s1.end());
        s1.erase(--s1.end());
        s2.insert(t1);
        t1 = *(s2.begin());
        s2.erase(s2.begin());
        s1.insert(t1);  
      }
    
      int cap = (vc.size()+1)/2;
    //  printf("cap:%d %d
    ", vc.size(), cap);
      if(s1.size() > cap) {
        it = --s1.end();
        s2.insert(*it);
        s1.erase(it);
      }else if(s1.size() < cap) {
        it = s2.begin();
        s1.insert(*it);
        s2.erase(it);
      }
    
    }
    void pop(int x) {
      it = s1.find(x);
      if(it != s1.end()) {
        s1.erase(it);
      }else {
        it = s2.find(x);
        s2.erase(it);
      }
      adjust();
    }
    int main() {
      int n;
      while(~scanf("%d", &n)) {
        vc.clear(); s1.clear(); s2.clear();
    
        for(int i = 0; i < n; ++i) {
          char s[10];
          scanf("%s", s);
          if(s[1] == 'o') {
            if(vc.size() > 0) {
              int tt = vc[vc.size()-1];
              vc.erase(--vc.end());
              pop(tt);
              printf("%d
    ", tt);
    
            }else printf("Invalid
    ");
          }else if(s[1] == 'e') {
            if(vc.size() > 0) {
              printf("%d
    ", *(--s1.end()));
            }else printf("Invalid
    ");
          }else {
            int a; scanf("%d", &a);
            vc.push_back(a);
            s1.insert(a); 
            adjust();
          }
    
        //  for(it = s1.begin(); it != s1.end(); ++it) printf("%d ", *it); printf("h1
    ");
        //  for(it = s2.begin(); it != s2.end(); ++it) printf("%d ", *it); printf("h2
    ");
        }
      }
      return 0;
    }

    1058

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<ctime>
    #include<cstdlib>
    #include<map>
    #include<set>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 1e3+5;
    typedef long long ll;
    #define MP(x, y) make_pair(x, y);
    
    int a[2][3];
    int ans[3];
    int main() {
      for(int i = 0; i < 2; ++i) {
        scanf("%d.%d.%d", &a[i][0], &a[i][1], &a[i][2]);
      }
    
      int pre = 0;
      for(int i = 2; i >= 0; --i) {
        int t1 = a[0][i] + a[1][i] + pre;
        if(i == 2) {
          ans[i] = t1%29; pre = t1/29;
        }else if(i == 1) {
          ans[i] = t1%17; pre = t1/17;
        }else ans[i] = t1;
      }
    
      printf("%d.%d.%d
    ", ans[0], ans[1], ans[2]);
      return 0;
    }

    1059

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<ctime>
    #include<cstdlib>
    #include<map>
    #include<set>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 1e5+5;
    typedef long long ll;
    #define MP(x, y) make_pair(x, y);
    
    int prime[N];
    int isprime[N]; int tot;
    int main() {
      tot = 0;
      for(int i = 2; i < N; ++i) {
        if(!prime[i]) {
          isprime[++tot] = i;
          for(int j = 2*i; j < N; j += i) {
            prime[j] ++;
          }
        }
      }
    
      ll n;
      while(~scanf("%lld", &n)) {
        if(n == 1) {
          printf("1=1
    ");
          continue;
        }
        int fl = 1;
        printf("%lld=", n);
        for(int i = 1; i <= tot; ++i) {
          if(n%isprime[i] == 0) {
            int cnt = 0;
            while(n%isprime[i] == 0) {
              n /= isprime[i];
              cnt ++;
            }
            if(fl) fl = 0; else printf("*");
            printf("%d", isprime[i]);
            if(cnt > 1) printf("^%d", cnt);
          }
          if(n == 1 || isprime[i] > n) break;
        }
        if(n > 1) {
          if(fl) fl = 0; else printf("*");
          printf("%lld", n);
        }
        printf("
    ");
      }
      return 0;
    }

    1060 大模拟,坑点,k有负数,k可能大于10,0似乎应用0.00*10^0表示(可能不是但是那个数据被我试出来似的),

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<ctime>
    #include<cstdlib>
    #include<map>
    #include<set>
    
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 1e5+5;
    typedef long long ll;
    #define MP(x, y) make_pair(x, y);
    
    char a[205], b[205];
    char A[205]; char B[205];
    int n;
    
    void solve1() {
      int l1 = strlen(a); int cnt = 0;
      int stpoi = -1, edpoi = l1;
      for(int i = 0; i < l1; ++i) {
        if(a[i] == '.') edpoi = i;
        if(a[i] != '0' && a[i] != '.' && stpoi == -1) {
          stpoi = i;
        }
      }
      if(stpoi == -1) {
      //  while(1);
        A[cnt++] = '0'; A[cnt++] = '.';
        for(int i = 0; i < n; ++i) A[cnt++] = '0';
        A[cnt++] = '*'; A[cnt++] = '1'; A[cnt++] = '0'; A[cnt++] = '^'; A[cnt++] = '0';
        A[cnt] = 0;
        return;
      }
    
    
    
      A[cnt++] = '0'; A[cnt++] = '.';
      for(int i = stpoi; i < l1; ++i) {
        if(i == edpoi) continue;
        A[cnt++] = a[i];
        if(cnt-2 == n) {
          break;
        }
      }  
      if(cnt-2 < n) {
        int ed = n-cnt+2;
        for(int i = 1; i <= ed; ++i) {
          A[cnt++] = '0';
        }
      }
      int tt = edpoi - stpoi;
      if(tt < 0) tt ++;
      if(1) { A[cnt++] = '*'; A[cnt++] = '1'; A[cnt++] = '0'; A[cnt++] = '^'; if(tt < 0) A[cnt++] = '-'; if(tt > 10) A[cnt++] = '0'+tt/10, tt %= 10; A[cnt++] = '0'+abs(tt); }
      A[cnt] = 0;
    }
    void solve2() {
      int l1 = strlen(b); int cnt = 0;
      int stpoi = -1, edpoi = l1;
      for(int i = 0; i < l1; ++i) {
        if(b[i] == '.') edpoi = i;
        if(b[i] != '0' && b[i] != '.' && stpoi == -1) {
          stpoi = i;
        }
      }
      if(stpoi == -1) {
        B[cnt++] = '0'; B[cnt++] = '.';
        for(int i = 0; i < n; ++i) B[cnt++] = '0';
        B[cnt++] = '*'; B[cnt++] = '1'; B[cnt++] = '0'; B[cnt++] = '^'; B[cnt++] = '0';
        B[cnt] = 0;
        return;
      }
    
    
    
      B[cnt++] = '0'; B[cnt++] = '.';
      for(int i = stpoi; i < l1; ++i) {
        if(i == edpoi) continue;
        B[cnt++] = b[i];
        if(cnt-2 == n) {
          break;
        }
      }  
      if(cnt-2 < n) {
        int ed = n-cnt+2;
        for(int i = 1; i <= ed; ++i) {
          B[cnt++] = '0';
        }
      }
      int tt = edpoi - stpoi;
      if(tt < 0) tt ++;
      if(1) { B[cnt++] = '*'; B[cnt++] = '1'; B[cnt++] = '0'; B[cnt++] = '^'; if(tt < 0) B[cnt++] = '-'; if(tt > 10) B[cnt++] = tt/10+'0', tt %= 10; B[cnt++] = '0'+abs(tt); }
      B[cnt] = 0;
    }
    
    
    
    
    int main() {
      while(~scanf("%d %s %s", &n, a, b)) {
        solve1(); solve2();
    
        int fl = 1;
        int l1 = strlen(A); int l2 = strlen(B);
        if(l1 != l2) fl = 0;
        for(int i = 0; i < l1 && fl; ++i) {
          if(A[i] != B[i]) {
            fl = 0; break;
          }
        }
    
        if(fl) printf("YES %s
    ", A);
        else printf("NO %s %s
    ", A, B);
      }
      return 0;
    }
  • 相关阅读:
    eclipse中文乱码问题解决方案
    修改Tomcat的JDK目录
    Tomcat 5.5 修改服务器的侦听端口
    HTML DOM教程 27HTML DOM Button 对象
    HTML DOM教程 24HTML DOM Frameset 对象
    Navicat for MySQL v8.0.27 的注册码
    HTML DOM教程 25HTML DOM IFrame 对象
    Tomcat 5.5 的下载和安装
    android manifest相关属性
    ubuntu10.04 下 eclipse 小结
  • 原文地址:https://www.cnblogs.com/Basasuya/p/8433708.html
Copyright © 2011-2022 走看看