• 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;
    }
  • 相关阅读:
    1242 斐波那契数列的第N项
    1256 乘法逆元
    1264 线段相交
    1265 四点共面
    Uva10881 Piotr's Ants
    hdu 5438 Ponds 长春网赛1002
    CodeForces 540D Bad Luck Island 概率dp
    hdu 1281 二分图残量增广
    hdu 2444判定二分图+最大匹配
    hdu 3416 Marriage Match IV
  • 原文地址:https://www.cnblogs.com/Basasuya/p/8433708.html
Copyright © 2020-2023  润新知