pat1051-1060

来源:互联网 发布:网站域名查询注册 编辑:程序博客网 时间:2024/05/14 04:36

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;}
原创粉丝点击