pat1041-1050
来源:互联网 发布:网络优化大师qq首页 编辑:程序博客网 时间:2024/06/13 18:47
没想到半天就做完了10题 = =,这几题太简单了,基本10分钟一题
1041
#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 = 1e5+5;const int INF = 0x3f3f3f3f;#define MP(x, y) make_pair(x, y)int A[N];map<int, int> mp;int main() { int n; while(~scanf("%d", &n)) { mp.clear(); for(int i = 1; i <= n; ++i) scanf("%d", &A[i]), mp[A[i]] ++; int fl = 0; for(int i = 1; i <= n; ++i) { if(mp[A[i]] == 1) { printf("%d\n", A[i]); fl = 1; break; } } if(!fl) printf("None\n"); } return 0;}
1042
#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 = 4e4+5;const int INF = 0x3f3f3f3f;#define MP(x, y) make_pair(x, y)int card[2][N]; int fl;void put(int x) { int t1 = (x-1)/13; int t2 = (x-1)%13; t2 ++; if(t1 == 4) printf("J%d", t2); else if(t1 == 3) printf("D%d", t2); else if(t1 == 2) printf("C%d", t2); else if(t1 == 1) printf("H%d", t2); else printf("S%d", t2);}int Swap[60];int main() { int K; while(~scanf("%d", &K)) { fl = 0; for(int i = 1; i <= 54; ++i) card[fl][i] = i; for(int i = 1; i <= 54; ++i) scanf("%d", &Swap[i]); for(int i = 0; i < K; ++i) { for(int j = 1; j <= 54; ++j) { card[fl^1][Swap[j]] = card[fl][j]; } fl ^= 1; } for(int i = 1; i <= 54; ++i) { if(i != 1) printf(" "); put(card[fl][i]); } printf("\n"); } return 0;}
1043 这题还是花了一点时间。这是一个反证思想,虽然你按照这个序列插入的树,其他序列可能插入也是这样,但是你反过来验证一下不就行了= =
#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 n;int A[N];int lef[N], righ[N];int root;void find(int x, int id) { if(A[x] <= A[id]) { if(righ[x] == 0) righ[x] = id; else find(righ[x], id); }else { if(lef[x] == 0) lef[x] = id; else find(lef[x], id); }} void _find(int x, int id) { if(A[x] > A[id]) { if(righ[x] == 0) righ[x] = id; else _find(righ[x], id); }else { if(lef[x] == 0) lef[x] = id; else _find(lef[x], id); }} int output[N]; int cnt = 0;void preorder(int x) { ++cnt; output[cnt] = x; if(lef[x]) preorder(lef[x]); if(righ[x]) preorder(righ[x]);}void postorder(int x) { if(lef[x]) postorder(lef[x]); if(righ[x]) postorder(righ[x]); ++cnt; output[cnt] = x;}int main() { while(~scanf("%d", &n)) { memset(lef, 0, sizeof(lef)); memset(righ, 0, sizeof(righ)); for(int i = 1; i <= n; ++i) { scanf("%d", &A[i]); } root = 1; for(int i = 2; i <= n; ++i) { find(root, i); } cnt = 0; preorder(root); int flag = 1; for(int i = 1; i <= n; ++i) { if(output[i] != i) { flag = 0; break; } } if(flag) { cnt = 0; printf("YES\n"); postorder(root); for(int i = 1; i <= n; ++i) { if(i != 1) printf(" "); printf("%d", A[output[i]]); } printf("\n"); continue; } memset(lef, 0, sizeof(lef)); memset(righ, 0, sizeof(righ)); root = 1; for(int i = 2; i <= n; ++i) { _find(root, i); } cnt = 0; preorder(root); flag = 1; for(int i = 1; i <= n; ++i) { if(output[i] != i) { flag = 0; break; } } if(flag) { cnt = 0; printf("YES\n"); postorder(root); for(int i = 1; i <= n; ++i) { if(i != 1) printf(" "); printf("%d", A[output[i]]); } printf("\n"); }else printf("NO\n"); } return 0;}
1044 二分一下就行,比较简单
#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<algorithm>#include<ctime>#include<cstdlib>using namespace std;const int INF = 0x3f3f3f3f;const int N = 1e5+5;typedef long long ll;int value[N];int suf[N];int main() { int n, m; while(~scanf("%d %d", &n, &m)) { int fl = 0; for(int i = 1; i <= n; ++i) { scanf("%d", &value[i]); // if(value[i] <= 0) while(1); } suf[0] = 0; int pre = 0; int minn = INF; for(int i = 1; i <= n; ++i) { pre += value[i]; suf[i] = pre; // printf("%d ", suf[i]); // if(i == 1) continue; int id = lower_bound(suf, suf+i, pre-m) - suf; if(suf[id] == pre-m) { printf("%d-%d\n", id+1, i); fl = 1; }else { if(id == 0) continue; int tt = suf[i] - suf[id-1]; if(tt > m) minn = min(minn, tt); } } if(!fl) { pre = 0; for(int i = 1; i <= n; ++i) { pre += value[i]; suf[i] = pre; // if(i == 1) continue; int id = lower_bound(suf, suf+i, pre - minn) - suf; if(suf[id] == pre - minn) { printf("%d-%d\n", id+1, i); // fl = 1; } } } } return 0;}
1045 这题dp,每次讨论一个点,找到此时,小于等于该物品喜欢程度为结尾的物品的最大值,当然我用树状数组加速了
#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<algorithm>#include<ctime>#include<cstdlib>using namespace std;const int INF = 0x3f3f3f3f;const int N = 1e5+5;typedef long long ll;int fav[205];int fav_[205];int stripe[10005];int tree[205];int n, m, len;void add(int pos, int num) { for(int i = pos; i <= m; i += i&-i) { tree[i] = max(tree[i], num); }}int sum(int pos) { int ans = 0; for(int i = pos; i; i -= i&-i) { ans = max(ans, tree[i]); } return ans;}int main() { while(~scanf("%d", &n)) { memset(fav_, 0, sizeof(fav_)); memset(tree, 0, sizeof(tree)); scanf("%d", &m); for(int i = 1; i <= m; ++i) { scanf("%d", &fav[i]); fav_[fav[i]] = i; } scanf("%d", &len); for(int i = 1; i <= len; ++i) { scanf("%d", &stripe[i]); } for(int i = 1; i <= len; ++i) { if(fav_[stripe[i]] == 0) continue; int id = fav_[stripe[i]]; int tt = sum(id)+1; add(id, tt); } printf("%d\n", sum(m)); } return 0;}
1046
#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<algorithm>#include<ctime>#include<cstdlib>using namespace std;const int INF = 0x3f3f3f3f;const int N = 1e5+5;typedef long long ll;int d[N];ll suf[N];int main() { int n, m; while(~scanf("%d", &n)) { suf[0] = 0; for(int i = 1; i <= n; ++i) { scanf("%d", &d[i]); suf[i] = suf[i-1] + d[i]; } scanf("%d", &m); for(int i = 1; i <= m; ++i) { int a, b; scanf("%d %d", &a, &b); if(a > b) swap(a, b); ll tmp = suf[b-1] - suf[a-1]; ll ans = min(tmp, suf[n] - tmp); printf("%lld\n", ans); } } return 0;}
1047 还是先将字符串处理成了数字,这样更快
#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<algorithm>#include<ctime>#include<cstdlib>using namespace std;const int INF = 0x3f3f3f3f;const int N = 1e5+5;typedef long long ll;int change(char *a) { int ans = 0; for(int i = 0; i < 3; ++i) { ans = ans*100 + a[i]-'A'; } ans = ans*100 + a[3]-'0'+30; return ans;}void put(int x) { printf("%c%c%c%c\n", x/1000000+'A', (x%1000000)/10000+'A', (x%10000)/100+'A', (x%100-30)+'0' ); }vector<int> course[2505];int main() { int n, k; while(~scanf("%d %d", &n, &k)) { for(int i = 1; i <= k; ++i) course[i].clear(); for(int i = 0; i < n; ++i) { char s[10]; int a; scanf("%s %d", s, &a); int id = change(s); for(int j = 0; j < a; ++j) { int b; scanf("%d", &b); course[b].push_back(id); } } for(int i = 1; i <= k; ++i) { printf("%d %d\n", i, course[i].size()); sort(course[i].begin(), course[i].end()); for(int j = 0; j < course[i].size(); ++j) { put(course[i][j]); } } } return 0;}
1048
#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;int coin[N];map<int, int> mp;int main() { int n, m; while(~scanf("%d %d", &n, &m)) { mp.clear(); for(int i = 1; i <= n; ++i) { scanf("%d", &coin[i]); mp[coin[i]] ++; } sort(coin+1, coin+n+1); int fl = 0; for(int i = 1; i <= n; ++i) { int re = m - coin[i]; if(re == coin[i]) { if(mp[re] >= 2) { printf("%d %d\n", re, re); fl = 1; break; } }else { if(mp.find(re) != mp.end()) { printf("%d %d\n", coin[i], re); fl = 1; break; } } } if(!fl) printf("No Solution\n"); } return 0;}
1049 这题还是要想下,先预处理 0-999999 那么一个大于1e6的数就可以拆分成前五位,后五位来做就行啦
#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 = 1e6;typedef long long ll;ll num[N];int cal(int x) { int ans = 0; while(x) { int tt = x%10; if(tt == 1) ans ++; x /= 10; } return ans;}int main() { num[0] = 0; for(int i = 1; i < N; ++i) { num[i] = num[i-1] + cal(i); } int x; while(~scanf("%d", &x)) { if(x < 1e6) printf("%lld\n", num[x]); else { int t1 = x % 1000000; int t2 = x / 1000000; ll ans = (num[t2]-cal(t2)) * 1e6 + 1ll*cal(t2)*(t1+1) + num[999999] * t2 + num[t1]; printf("%lld\n", ans); } } return 0;}
1050
#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 = 1e4+5;typedef long long ll;char a[N], b[N];int has[200];int main() { memset(has, 0, sizeof(has)); gets(a); gets(b); for(int i = 0; b[i]; ++i) { has[b[i]] ++; } for(int i = 0; a[i]; ++i) { if(!has[a[i]]) printf("%c", a[i]); } printf("\n"); return 0;}
阅读全文
0 0
- pat1041-1050
- pat1041
- [哈希]PAT1041 Be Unique
- pat1041 Be Unique
- pat1041考试座位号
- PAT1041考试座位号
- pat1041:考试座位号
- PAT1041. Be Unique (20)
- pat1041. 考试座位号(15)
- PAT1041考试座位号(15)
- PAT1041. 考试座位号(15) C++
- 1050
- 1050
- 1050
- 1050
- 1050
- POJ 1050
- poj 1050
- Java swing创建按钮并添加到面板中
- C
- bootstrap调整Glyphicons图标大小
- 1.14 救援模式
- 找工作笔试面试那些事儿(7)---测试题答案
- pat1041-1050
- Android开发中常见的10个错误
- 【IO流】Properties操作配置文件
- Java实现-颜色分类
- 深入理解并发容器-ConcurrentHashMap(JDK8版本)
- 泛型(笔记)
- 1.15 创建链接克隆虚拟机
- 自动加载函数流程之composer autoload_real.php
- 关于线程同步(5种同步方式)