From 65acb23cce8be94dd22fc17e8cde043eb466b87d Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 24 Mar 2015 09:58:19 +0800 Subject: [PATCH] Revert "Revert "PC file"" This reverts commit 0dc63889f6988674cbf28dbc5fd336b8ee51102c. --- 1002.cpp | 45 ++++++++++++++++ 1003.cpp | 16 ++++++ 1004.cpp | 16 ++++++ 1034.cpp | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1038.cpp | 50 ++++++++++++++++++ 1064.cpp | 100 ++++++++++++++++++++++++++++++++++++ 1070.cpp | 56 ++++++++++++++++++++ 1072.cpp | 129 ++++++++++++++++++++++++++++++++++++++++++++++ 1074.cpp | 67 ++++++++++++++++++++++++ 1075.cpp | 122 ++++++++++++++++++++++++++++++++++++++++++++ 1077.cpp | 49 ++++++++++++++++++ 1081.cpp | 119 +++++++++++++++++++++++++++++++++++++++++++ 1090.cpp | 68 +++++++++++++++++++++++++ 13 files changed, 989 insertions(+) create mode 100644 1002.cpp create mode 100644 1003.cpp create mode 100644 1004.cpp create mode 100644 1034.cpp create mode 100644 1038.cpp create mode 100644 1064.cpp create mode 100644 1070.cpp create mode 100644 1072.cpp create mode 100644 1074.cpp create mode 100644 1075.cpp create mode 100644 1077.cpp create mode 100644 1081.cpp create mode 100644 1090.cpp diff --git a/1002.cpp b/1002.cpp new file mode 100644 index 0000000..bcfd479 --- /dev/null +++ b/1002.cpp @@ -0,0 +1,45 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace std; + +int main(int argc, char* argv[]) { + int n; + vector v1(1001, 0); + vector v2(1001, 0); + int k; + double a; + + scanf("%d", &n); + for(int i = 0; i < n; ++i) { + scanf("%d%lf", &k, &a); + v1[k] = a; + } + scanf("%d", &n); + for(int i = 0; i < n; ++i) { + scanf("%d%lf", &k, &a); + v2[k] = a; + } + int count = 0; + for(int i = 0; i <= 1000; ++i) { + v1[i] += v2[i]; + if(v1[i] != 0) + ++count; + } + printf("%d", count); + for(int i = 1000; count > 0 && i >= 0 ; --i) { + if(v1[i] == 0) + continue; + --count; + printf(" %d %.1f", i, v1[i]); + } + printf("\n"); + return 0; +} diff --git a/1003.cpp b/1003.cpp new file mode 100644 index 0000000..331c150 --- /dev/null +++ b/1003.cpp @@ -0,0 +1,16 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace std; + +int main(int argc, char* argv[]) { + + return 0; +} diff --git a/1004.cpp b/1004.cpp new file mode 100644 index 0000000..331c150 --- /dev/null +++ b/1004.cpp @@ -0,0 +1,16 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace std; + +int main(int argc, char* argv[]) { + + return 0; +} diff --git a/1034.cpp b/1034.cpp new file mode 100644 index 0000000..1e86448 --- /dev/null +++ b/1034.cpp @@ -0,0 +1,152 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +//#define DEBUG + + +using namespace std; + +const int MINNUM = 2; +vector pre; +vector bingNum; + +class Record{ +public: + string a; + string b; + int weight; + Record(string tmp1, string tmp2, int tmp3):a(tmp1), b(tmp2), weight(tmp3){}; +}; + +class intRecord { +public: + int a; + int b; + intRecord(int tmp1, int tmp2):a(tmp1), b(tmp2){}; +}; + +class Gang{ +public: + string head; + int num; + Gang(string tmp1, int tmp2):head(tmp1), num(tmp2){}; +}; + +bool cmp(const Gang &lhs, const Gang &rhs) { + return lhs.head < rhs.head; +} + +int findRoot(int a) { + int cur = a; + while(cur != pre[cur]) { + cur = pre[cur]; + } + return cur; +} + +void merge(int a, int b) { + int ra = findRoot(a), rb = findRoot(b); + if(ra == rb) + return; + if(bingNum[ra] < bingNum[rb]) { + pre[ra] = rb; + } + else { + pre[rb] = ra; + if(bingNum[ra] == bingNum[rb]) + bingNum[ra]++; + } +} + + +int main(int argc, char *argv[]) { +#ifdef DEBUG + freopen("in.txt", "r", stdin); + freopen("out.txt", "w", stdout); +#else +#endif + int N, K; + scanf("%d%d", &N, &K); + vector records; + set s; + for(int i = 0; i < N; ++i) { + string tmp1, tmp2; + int tmp3; + cin >> tmp1 >> tmp2 >> tmp3; + records.push_back(Record(tmp1, tmp2, tmp3)); + s.insert(tmp1); + s.insert(tmp2); + } + map name2id; + map id2name; + int i = 0; + for(set::iterator iter = s.begin(); iter != s.end(); ++iter, ++i) { + name2id[ (*iter) ] = i; + id2name[ i ] = (*iter); + } + int num = s.size(); + vector gangW(num, 0); + vector intRecords; + + for(int i = 0; i < records.size(); ++i) { + int tmp1 = name2id[ records[i].a ], tmp2 = name2id[ records[i].b ]; + //if(tmp1 == tmp2) + // continue; + gangW[tmp1] += records[i].weight; + gangW[tmp2] += records[i].weight; + intRecords.push_back(intRecord(tmp1, tmp2)); + } + + // bing cha + for(int i = 0; i < num; ++i) + pre.push_back(i); + for(int i = 0; i < num; ++i) + bingNum.push_back(1); + + for(int i = 0; i < intRecords.size(); ++i) { + merge(intRecords[i].a, intRecords[i].b); + } + + map< int, vector > links; + set ids; + for(int i = 0; i < num; ++i) { + int id = findRoot(i); + links[ id ].push_back(i); + ids.insert( id ); + } + vector result; + for(set::iterator iter = ids.begin(); iter != ids.end(); ++iter) { + int id = *iter; + if(links[id].size() <= MINNUM) + continue; + int sum = 0; + for(int i = 0; i < links[id].size(); ++i) { + sum += gangW[ links[id][i] ]; + } + if(sum / 2 <= K) + continue; + int head = 0; + for(int i = 0; i < links[id].size(); ++i) { + if(gangW[ links[id][i] ] > gangW[ links[id][head] ]) { + head = i; + } + } + result.push_back( Gang( id2name[ links[id][head] ], links[id].size() ) ); + } + + sort(result.begin(), result.end(), cmp); + cout << result.size() << endl; + + for(int i = 0; i < result.size(); ++i) { + cout << result[i].head << " " << result[i].num << endl; + } + + + return 0; +} \ No newline at end of file diff --git a/1038.cpp b/1038.cpp new file mode 100644 index 0000000..668f4d2 --- /dev/null +++ b/1038.cpp @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + +bool cmp(const string &lhs, const string &rhs){ + string a = lhs, b = rhs; + a.append(rhs); + b.append(lhs); + return a < b; +} + +int main(int argc, char *argv) { +#ifndef ONLINE_JUDGE + freopen("in.txt", "r", stdin); + freopen("out.txt", "w", stdout); +#endif + + int n; + cin >> n; + vector v(n); + for(int i = 0; i < n; ++i) + cin >> v[i]; + sort(v.begin(), v.end(), cmp); + bool start = false; + for(int i = 0; i < v.size(); ++i) { + if(start) { + cout << v[i]; + } + else { + for(int j = 0; j < v[i].size(); ++j) { + if(start) { + cout << v[i][j]; + } + else if(!start && '0' != v[i][j]) { + start = true; + cout << v[i][j]; + } + } + } + } + if(!start) + cout << "0"; + cout << endl; + return 0; +} \ No newline at end of file diff --git a/1064.cpp b/1064.cpp new file mode 100644 index 0000000..ffed15c --- /dev/null +++ b/1064.cpp @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +int f[20]; + +struct node { + int val; + node *left; + node *right; +}; + +int getRootPos(int n) { + if(0 == n) + return 0; + if(1 == n) + return 1; + + int height = 0; + int i = 0; + for(; i < 20; ++i) { + if(n < f[i]) + break; + } + height = i; + int remain = min( n - f[height - 1], (f[height] - f[height-1]) / 2 ); + return (f[height - 1] - 1) / 2 + remain + 1; +} + +node* getResult(const vector &v, int startPos, int endPos) { + int n = endPos - startPos + 1; + if(n <= 0) + return NULL; + int rootPos = getRootPos(n); + node* root = new node(); + root->val = v[ startPos + rootPos -1 ]; + root->left = getResult(v, startPos, startPos + rootPos - 2); + root->right = getResult(v, startPos + rootPos, endPos); + return root; +} + +void printTree(node *root) { + if(root == NULL) + return; + queue q; + vector v; + q.push(root); + while(q.size() != 0) { + v.push_back(q.front()->val); + if(NULL != q.front()->left) + q.push(q.front()->left); + if(NULL != q.front()->right) + q.push(q.front()->right); + q.pop(); + } + printf("%d", v[0]); + for(int i = 1; i < v.size(); ++i) { + printf(" %d", v[i]); + } + printf("\n"); +} + +int main(int argc, char *agrv[]) { + // 2 pow + int base = 1; + for(int i = 0; i < 20; ++i) { + f[i] = base; + base *= 2; + } + for(int i = 1; i < 20; ++i) { + f[i] += f[i-1]; + } + + // get input + int n; + scanf("%d", &n); + if(0 == n) + return 0; + + vector v(n); + for(int i = 0; i < n; ++i) { + scanf("%d", &v[i]); + } + + // + sort(v.begin(), v.end()); + vector result; + node *root = getResult(v, 0, v.size()-1); + + // print result; + printTree(root); + + return 0; +} \ No newline at end of file diff --git a/1070.cpp b/1070.cpp new file mode 100644 index 0000000..0f9bc19 --- /dev/null +++ b/1070.cpp @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include + +using namespace std; + +class Cake { +public: + double _weight; + double _price; + double _eps; +}; + +bool cmp(const Cake &lhs, const Cake &rhs) { + return lhs._eps > rhs._eps; +} + +int main(int argc, char *argv[]) { + int n, v; + scanf("%d%d", &n, &v); + vector cakes(n); + Cake tmp; + for(int i = 0; i < n; ++i) + scanf("%lf", &cakes[i]._weight); + for(int i = 0; i < n; ++i) + scanf("%lf", &cakes[i]._price); + vector fcakes; + for(int i = 0; i < n; ++i) { + if(cakes[i]._weight != 0 && cakes[i]._price != 0) { + cakes[i]._eps = cakes[i]._price / cakes[i]._weight; + fcakes.push_back(cakes[i]); + } + } + if(v == 0 || fcakes.size() == 0) { + printf("0.00\n"); + return 0; + } + sort(fcakes.begin(), fcakes.end(), cmp); + double result = 0; + for(int i = 0; i < fcakes.size(); ++i) { + if(0 == v) + break; + if(v >= fcakes[i]._weight) { + result += fcakes[i]._price; + v -= fcakes[i]._weight; + } + else { + result += fcakes[i]._price * 1.0 * v / fcakes[i]._weight; + v = 0; + } + } + printf("%.2f\n", result); + return 0; +} \ No newline at end of file diff --git a/1072.cpp b/1072.cpp new file mode 100644 index 0000000..e816c8e --- /dev/null +++ b/1072.cpp @@ -0,0 +1,129 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +int N, M, K, D, NM; + +class Gas { +public: + double minimum; + double average; + int index; + bool operator < (const Gas &rhs) const { + if(minimum != rhs.minimum) + return minimum > rhs.minimum; + else { + if(average != rhs.average) + return average < rhs.average; + else { + return index < rhs.index; + } + } + } +}; + + +int string2int(string s) { + // M <= 10 + if('G' == s[0]) { + if(3 == s.size()) + return 10 + N; + else + return s[1] - '0' + N; + } + else { + stringstream ss; + ss << s; + int result; + ss >> result; + return result; + } +} + +int main(int argc, char *argv[]) { +#ifndef ONLINE_JUDGE + freopen("in.txt", "r", stdin); + freopen("out.txt", "w", stdout); +#endif + + cin >> N >> M >> K >> D; + NM = N + M; + vector< vector > w(NM + 1, vector(NM + 1, INT_MAX / 4) ); + for(int i = 1; i <= NM; ++i) + w[i][i] = 0; + for(int i = 0; i < K; ++i) { + string tmp1, tmp2; + int d, index1, index2; + cin >> tmp1 >> tmp2 >> d; + index1 = string2int(tmp1); + index2 = string2int(tmp2); + w[index1][index2] = d; + w[index2][index1] = d; + } + + if(N <= 0 || M <= 0) { + cout << "No Solution" << endl; + return 0; + } + + vector result; + + for(int gi = 1; gi <= M; ++gi) { + int gIndex = gi + N; + vector d(NM+1, INT_MAX / 4); + d[gIndex] = 0; + vector visited(NM+1, false); + for(int k = 1; k <= NM; ++k) { + int small = INT_MAX; + int smallIndex = -1; + for(int i = 1; i <= NM; ++i) { + if(!visited[i] && d[i] < small) { + small = d[i]; + smallIndex = i; + } + } + visited[smallIndex] = true; + for(int i = 1; i <= NM; ++i) { + d[i] = min(d[i], d[smallIndex] + w[smallIndex][i]); + } + } + + Gas tmp; + double tavrage = 0; + int tmin = INT_MAX; + bool unReach = false; + for(int i = 1; i <= N; ++i) { + if(d[i] > D) { + unReach = true; + break; + } + tmin = min(tmin, d[i]); + tavrage += d[i]; + } + if(!unReach) { + tmp.average = tavrage / N; + tmp.minimum = tmin; + tmp.index = gi; + result.push_back(tmp); + } + } + + + if(0 == result.size()) { + cout << "No Solution" << endl; + } + else { + sort(result.begin(), result.end()); + printf("G%d\n", result[0].index); + printf("%.1f %.1f\n", result[0].minimum, result[0].average); + } + + return 0; +} \ No newline at end of file diff --git a/1074.cpp b/1074.cpp new file mode 100644 index 0000000..6e17adb --- /dev/null +++ b/1074.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + +class Node{ +public: + int adr; + int val; +}; + +int nexts[100000]; +int values[100000]; +vector v; + +int main(int argc, char *argv[]) { +#ifndef ONLINE_JUDGE + freopen("in.txt", "r", stdin); + freopen("out.txt", "w", stdout); +#endif + + int root, N, K; + scanf("%d%d%d", &root, &N, &K); + for(int i = 0; i < N; ++i) { + int cur, val, tmpNext; + scanf("%d%d%d", &cur, &val, &tmpNext); + nexts[cur] = tmpNext; + values[cur] = val; + } + int cur = root; + + while(-1 != cur) { + Node tmp; + tmp.adr = cur; + tmp.val = values[cur]; + v.push_back(tmp); + cur = nexts[cur]; + } + for(int i = 0; i < v.size(); i += K) { + if(i + K - 1 > v.size() - 1) { + for(int j = i; j < v.size() - 1; ++j) + printf("%05d %d %05d\n", v[j].adr, v[j].val, v[j+1].adr); + printf("%05d %d -1\n", v[v.size() - 1].adr, v[v.size() - 1].val); + } + else if(i + K - 1 == v.size() - 1) { + for(int j = v.size() - 1; j > i; --j) { + printf("%05d %d %05d\n", v[j].adr, v[j].val, v[j-1].adr); + } + printf("%05d %d -1\n", v[i].adr, v[i].val); + } + else { + for(int j = i + K - 1; j > i; --j) { + printf("%05d %d %05d\n", v[j].adr, v[j].val, v[j-1].adr); + } + if(i + 2 * K - 1 <= v.size() - 1) + printf("%05d %d %05d\n", v[i].adr, v[i].val, v[i + 2 * K - 1].adr); + else + printf("%05d %d %05d\n", v[i].adr, v[i].val, v[i + K].adr); + } + } + + return 0; +} \ No newline at end of file diff --git a/1075.cpp b/1075.cpp new file mode 100644 index 0000000..59cd8e3 --- /dev/null +++ b/1075.cpp @@ -0,0 +1,122 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + +class Student { +public: + int id; + vector p; + vector done; + int total; + int perfect; +}; + +bool cmp(const Student &lhs, const Student &rhs) { + if(lhs.total != rhs.total) { + return lhs.total > rhs.total; + } + else { + if(lhs.perfect != rhs.perfect) { + return lhs.perfect > rhs.perfect; + } + else { + return lhs.id < rhs.id; + } + } + +} + +int main(int argc, char *argv[]) { +#ifndef ONLINE_JUDGE + freopen("in.txt", "r", stdin); + freopen("out.txt", "w", stdout); +#endif + + int N, K, M; + cin >> N >> K >> M; + vector full(K); + for(int i = 0; i < K; ++i) + cin >> full[i]; + + vector v(N); + for(int i = 0; i < N; ++i) { + vector tmp(K, -1); + vector tmp2(K, -2); + v[i].p = tmp; + v[i].done = tmp2; + v[i].total = 0; + v[i].perfect = 0; + } + for(int i = 0; i < M; ++i) { + int sid, pid, score; + cin >> sid >> pid >> score; + sid--; + pid--; + if(score >= 0) + v[sid].done[pid] = 0; + v[sid].p[pid] = max(v[sid].p[pid], score); + v[sid].p[pid] = max(v[sid].p[pid], 0); + //if(score != -1) { + // v[sid].total += score; + // if(full[pid] == score) + // v[sid].perfect += 1; + //} + v[sid].id = sid; + + } + + for(int i = 0; i < v.size(); ++i) { + v[i].total = 0; + for(int j = 0; j < K; ++j) { + if(v[i].p[j] != -1) + v[i].total += v[i].p[j]; + if(full[j] == v[i].p[j]) + v[i].perfect += 1; + } + } + + sort(v.begin(), v.end(), cmp); + vector result; + + for(int i = 0; i < v.size(); ++i) { + bool allNone = true; + /*if(v[i].total != 0) + allNone = false;*/ + for(int j = 0; j < K; ++j) { + if(-2 != v[i].done[j]) { + allNone = false; + break; + } + } + if(allNone) + continue; + result.push_back(v[i]); + } + + int pre = result[0].total, curRank = 1, num = 0; + for(int i = 0; i < result.size(); ++i) { + if(result[i].total != pre) { + curRank += num; + num = 1; + pre = result[i].total; + } + else { + ++num; + } + printf("%d %05d %d", curRank, result[i].id + 1, result[i].total); + for(int j = 0; j < K; ++j) { + if(result[i].p[j] == -1) + printf(" -"); + else + printf(" %d", result[i].p[j]); + } + printf("\n"); + } + + return 0; +} \ No newline at end of file diff --git a/1077.cpp b/1077.cpp new file mode 100644 index 0000000..48d0ceb --- /dev/null +++ b/1077.cpp @@ -0,0 +1,49 @@ +#include +#include +#include +#include + +using namespace std; + +int main(int argc, char* argv[]) { + int N; + scanf("%d\n", &N); + if(0 == N) { + printf("nai\n"); + return 0; + } + vector v(N); + for(int i = 0; i < N; ++i) { + getline(cin, v[i]); + } + vector suffix; + + for(int index = 1; index <= v[0].size(); ++index) { + bool allequal = true; + char cur = v[0][v[0].size() - index]; + for(int i = 0; i < v.size(); ++i) { + if(v[i].size() - index < 0 || v[i][v[i].size() - index] != cur) { + allequal = false; + break; + } + } + if(allequal) { + suffix.push_back(cur); + } + else { + break; + } + } + + if(0 == suffix.size()) { + printf("nai\n"); + } + else { + for(int i = suffix.size() - 1; i >= 0; --i) { + cout << suffix[i]; + } + printf("\n"); + } + + return 0; +} \ No newline at end of file diff --git a/1081.cpp b/1081.cpp new file mode 100644 index 0000000..f67629e --- /dev/null +++ b/1081.cpp @@ -0,0 +1,119 @@ +#include +#include +#include +#include +#include + +using namespace std; + +class Rational { +public: + int flag; + int numerator; + int denominator; +}; + +int gcd(int a, int b) { + if(a == 0 || b == 0 || a == 1 || b == 1) + return 1; + a = abs(a); + b = abs(b); + if(b > a) + swap(a, b); + while(b != 0) { + int tmp = b; + b = a % b; + a = tmp; + } + return a; +} + +void fit(Rational &r) { + if(0 == r.numerator) { + r.flag = 1; + r.denominator = 1; + return; + } + int g = gcd(r.numerator, r.denominator); + r.numerator /= g; + r.denominator /= g; +} + +void sum(Rational &lhs, Rational &rhs) { + fit(lhs); + fit(rhs); + int g = gcd(lhs.denominator, rhs.denominator); + int newD = lhs.denominator / g * rhs.denominator; + int newN = lhs.flag * newD / lhs.denominator * lhs.numerator + rhs.flag * newD / rhs.denominator * rhs.numerator; + if(newN < 0) { + lhs.flag = -1; + newN = -newN; + } + else + lhs.flag = 1; + lhs.numerator = newN; + lhs.denominator = newD; +} + +int main(int argc, char *argv) { +#ifndef ONLINE_JUDGE + freopen("in.txt", "r", stdin); + freopen("out.txt", "w", stdout); +#endif + + int n; + cin >> n; + vector v(n); + for(int i = 0; i < n; ++i) { + int a, b; + scanf("%d/%d", &a, &b); + if(a < 0) { + v[i].flag = -1; + a = -a; + } + else + v[i].flag = 1; + v[i].numerator = a; + v[i].denominator = b; + } + + Rational result; + result.flag = 1; + result.numerator = 0; + result.denominator = 1; + + for(int i = 0; i < v.size(); ++i) { + sum(result, v[i]); + } + + fit(result); + + if(0 == result.numerator) { + printf("0\n"); + return 0; + } + + + int integer = result.numerator / result.denominator; + if(integer != 0) { + + if(-1 == result.flag) + printf("-"); + + printf("%d", integer); + } + + if(result.denominator != 1) { + if(integer != 0) + printf(" "); + else { + if(-1 == result.flag) + printf("-"); + } + printf("%d/%d", result.numerator % result.denominator, result.denominator); + } + + printf("\n"); + + return 0; +} \ No newline at end of file diff --git a/1090.cpp b/1090.cpp new file mode 100644 index 0000000..e66dd8e --- /dev/null +++ b/1090.cpp @@ -0,0 +1,68 @@ +#include +#include +#include +#include + +using namespace std; + +int main(int argc, char *argv[]) { + int N; + double P, r; + scanf("%d%lf%lf", &N, &P, &r); + r = 1.0 + r / 100; + vector pre(N, 0); + for(int i = 0; i < N; ++i) { + scanf("%d", &pre[i]); + } + vector root; + vector< vector > v(N, vector()); + for(int i = 0; i < pre.size(); ++i) { + if(-1 == pre[i]) + root.push_back(i); + else { + v[ pre[i] ].push_back(i); + } + } + int curNum = 0, curLen = 0, preNum = 0; + queue q; + for(int i = 0; i < root.size(); ++i) { + q.push(root[i]); + curNum++; + } + preNum = curNum; + curNum = 0; + q.push(-2); + + while(q.size() != 0) { + if(-2 == q.front() && q.size() == 1) { + q.pop(); + break; + } + else if(-2 == q.front()) { + q.pop(); + q.push(-2); + preNum = curNum; + curNum = 0; + ++curLen; + continue; + } + + int curIndex = q.front(); + q.pop(); + for(int i = 0; i < v[curIndex].size(); ++i) { + q.push(v[curIndex][i]); + curNum++; + } + // curNum += v[curIndex].size(); + } + + double result = P; + for(int i = 0; i < curLen; ++i) { + result *= r; + } + + // cout << curLen << " " << preNum << endl; + printf("%.2f %d\n", result, preNum); + + return 0; +}