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; +}