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;}
阅读全文
0 0
- pat1051-1060
- pat1051
- PAT1051
- pat1051
- PAT1051
- PAT1051
- pat1051 Pop Sequence
- PAT1051 复数乘法
- PAT1051 复数乘法
- 出栈序列的可能性判定问题(PAT1051)
- 1060
- 1060
- 1060
- hdu 1060
- hdu 1060
- HDU 1060
- hdu 1060
- LOJ 1060
- Webpack入门之遇到的那些坑,系列示例Demo
- 每天学一点Swift----面向对象下(二)
- linux字符驱动之定时器去抖动按键驱动
- 100 分钟 webpack 2.0 入门视频教程
- 三分钟看懂为何比特币会暴涨
- pat1051-1060
- DES加密
- Webpack 2和模板打包的初学者指南(上)
- zedboard REV D搭载linaro
- JVM(5):tomcat性能调优和性能监控(visualvm)
- Webpack 配置中的一股清流
- mybatis 通用mapper
- towebp-loader诞生记~ 一个webpack 图片loader
- webpack独立打包与缓存处理