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("\n");
      for(int j = 1; j <= n; ++j) {
      //  printf("%d ", vis[a[j]]);
      //  printf("hh\n");
    //    if(vis[a[j]]) continue;
    //    vis[a[j]] = 1;
        vector<int> vc; vc.clear();
        vc.push_back(a[j]);
      //  printf("hh\n");
        for(int k = j+1; k <= n; ++k) {
          if(a[k] < a[j]) {
          //  vis[a[k]] = 1;
            vc.push_back(a[k]);
          }
        }
      //  printf("hh\n");
      //  for(int k = 0; k < vc.size(); ++k) printf("%d ", vc[k]); printf("\n");
        for(int k = 0; k < (int)vc.size()-1; ++k) {
        //  printf("%d %d\n", vc[k], vc[k-1]);
          if(vc[k] < vc[k+1]) {
            fl = 0; break;
          }
        }
      //  printf("%d\n", fl);
      }
  //    for(int j = 1; j <= n; ++j) printf("%d ",a[j]); printf("\n"); 

    //  printf("%d\n", fl);
      for(int j = 1; j <= n; ++j) {
        int tt = a[j] - sum(a[j]);
      //  printf("%d\n", tt);
        add(a[j], 1);
        if(tt > m) {
        //  printf("%d %d\n", i, tt);
          fl = 0; break;
        }
      }


      if(fl) printf("YES\n");
      else printf("NO\n");
    }

  }
  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\n"); 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\n", 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\n");
      else printf("%05d\n", 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\n", x);
  if(Wei == s && !leaf[x]) {
  //  printf("%d\n", 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\n");
    dfs(0, wei[0]);
  //  printf("hh\n");

    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("\n");
    }
  }
  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\n", 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:\n", i);
      int cnt = 0;
      for(int j = 0; j < n; ++j) {
        if(E[j].age >= b && E[j].age <= c) {
          printf("%s %d %d\n", nam[E[j].namid], E[j].age, E[j].net);
          cnt ++;
          if(cnt == a) break;
        }
      }
      if(cnt == 0) printf("None\n");
    }
  }
  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("\n");
  }
  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\n", 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\n", tt);

        }else printf("Invalid\n");
      }else if(s[1] == 'e') {
        if(vc.size() > 0) {
          printf("%d\n", *(--s1.end()));
        }else printf("Invalid\n");
      }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\n");
    //  for(it = s2.begin(); it != s2.end(); ++it) printf("%d ", *it); printf("h2\n");
    }
  }
  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\n", 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\n");
      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("\n");
  }
  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\n", A);
    else printf("NO %s %s\n", A, B);
  }
  return 0;
}
posted @ 2017-06-06 19:03  basasuya  阅读(134)  评论(0编辑  收藏  举报