diff --git a/2017/8 April/Problem A/main.cpp b/2017/8 April/Problem A/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..75f36e04a1dee2c7febe56d696b7e2f46f07f785 --- /dev/null +++ b/2017/8 April/Problem A/main.cpp @@ -0,0 +1,40 @@ +#include <bits/stdc++.h> + +using namespace std; + +int N, K; +char S[10000]; + +void _main(int TEST) +{ + scanf("%s%d", S, &K); + N=strlen(S); + int ans=0; + for(int i=0; i+K-1<N; i++) if(S[i]=='-') + { + for(int j=0; j<K; j++) + S[i+j]^='-'^'+'; + ans++; + } + for(int i=0; i<N; i++) if(S[i]=='-') + ans=-1; + if(ans==-1) + printf("IMPOSSIBLE\n"); + else + printf("%d\n", ans); +} + +int main() +{ + freopen("A-large.in", "r", stdin); + freopen("A-large.out", "w", stdout); + int TEST; + scanf("%d", &TEST); + for(int i=1; i<=TEST; i++) + { + //cerr << i << endl; + printf("Case #%d: ", i); + _main(i); + } + return 0; +} diff --git a/2017/8 April/Solutions/pancake.cpp b/2017/8 April/Problem A/pancake.cpp similarity index 100% rename from 2017/8 April/Solutions/pancake.cpp rename to 2017/8 April/Problem A/pancake.cpp diff --git a/2017/8 April/Problem B/main.cpp b/2017/8 April/Problem B/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..432f5825dc80c730068074a5afeb10840706cd7c --- /dev/null +++ b/2017/8 April/Problem B/main.cpp @@ -0,0 +1,36 @@ +#include <bits/stdc++.h> + +using namespace std; + +long long N; + +long long rec(__int128 cur, int last) +{ + if(cur>N) + return 0; + long long ret=cur; + for(; last<=9; last++) + ret=max(ret, rec(cur*10+last, last)); + return ret; +} + +void _main(int TEST) +{ + scanf("%lld", &N); + printf("%lld\n", rec(0, 1)); +} + +int main() +{ + freopen("B-large.in", "r", stdin); + freopen("B-large.out", "w", stdout); + int TEST; + scanf("%d", &TEST); + for(int i=1; i<=TEST; i++) + { + //cerr << i << endl; + printf("Case #%d: ", i); + _main(i); + } + return 0; +} diff --git a/2017/8 April/Solutions/tidynumber.cpp b/2017/8 April/Problem B/tidynumber.cpp similarity index 100% rename from 2017/8 April/Solutions/tidynumber.cpp rename to 2017/8 April/Problem B/tidynumber.cpp diff --git a/2017/8 April/Solutions/tidynumberlarge.cpp b/2017/8 April/Problem B/tidynumberlarge.cpp similarity index 100% rename from 2017/8 April/Solutions/tidynumberlarge.cpp rename to 2017/8 April/Problem B/tidynumberlarge.cpp diff --git a/2017/8 April/Problem C/bathroom.cpp b/2017/8 April/Problem C/bathroom.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a33ff188b4e46079db1f4c613ceb5bec7c00cbcf --- /dev/null +++ b/2017/8 April/Problem C/bathroom.cpp @@ -0,0 +1,88 @@ +#include <cstdint> +#include <iostream> +#include <array> +#include <cmath> + +using namespace std; + +array<uint64_t, 2> bathroom(uint64_t k, uint64_t n) { + uint64_t a = k >> 1; + array<uint64_t, 2> ret; + cout << k << ", " << n << endl; + if (n == 1) { + if (k&1) { + ret[0] = a; + ret[1] = a; + return ret; + } + ret[0] = a; + ret[1] = a-1; + return ret; + } + if (n == 2) + return bathroom(k >> 1, 1); + if (n == 3) { + if (k&1) + return bathroom((k >> 1), 1); + return bathroom((k >> 1) -1, 1); + } + int downpower2 = (int)log2(k); + if ( n >= (1 << downpower2) || k - n < (1 << (downpower2-1))) { + cout << "straight to 0, 0" << endl; + ret[0] = 0; + ret[1] = 0; + return ret; + } + //* + if (n >= (1 << (downpower2-1)) && n < (1 << (downpower2))) { + cout << "straight to 1, 0 from "; + if (n >= (1 << (downpower2-1))) + cout << "first term" << endl; + else + cout << "second term" << endl; + ret[0] = 1; + if ( (1<<(downpower2+1)) -1 == k) + ret[1] = 1; + else + ret[1] = 0; + return ret; + }//*/ + int d = (1 << (downpower2 - 1)); + d = (int)log2(k-d) + 1; + ret = bathroom((k-d), n); + if (ret[0] == ret[1]) { + ret[0] += 1; + cout << "increased to " << ret[0] << ", " << ret[1] << endl; + return ret; + } + cout << "increased to " << ret[0] << ", " << ret[1] + 1 << endl; + ret[1] += 1; + return ret; +} + +int main() +{ + int numCases = 0; + cin >> numCases; + + for (int q = 0; q < numCases; q++) + { + uint64_t k = 0; + cin >> k; + + uint64_t n = 0; + cin >> n; + + uint64_t highest = 0; + + uint64_t lowest = 0; + + auto thing = bathroom(k, n); + + highest = thing[0]; + lowest = thing[1]; + + cout << "Case #" << q+1 << ": " << highest << " " << lowest << endl; + } + return 0; +} diff --git a/2017/8 April/Problem C/main.cpp b/2017/8 April/Problem C/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..74a49fe4268ffeddd162b308124eca7ceec7c9a2 --- /dev/null +++ b/2017/8 April/Problem C/main.cpp @@ -0,0 +1,45 @@ +#include <bits/stdc++.h> + +using namespace std; + +long long N, K; + +void _main(int TEST) +{ + scanf("%lld%lld", &N, &K); + map<long long, long long> Q; + Q[N]=1; + while(!Q.empty()) + { + long long n=(--Q.end())->first; + long long k=(--Q.end())->second; + if(k==0) + continue; + if(k>=K) + { + printf("%lld %lld\n", n/2, (n-1)/2); + break; + } + K-=k; + Q.erase(--Q.end()); + if(n/2>0) + Q[n/2]+=k; + if((n-1)/2>0) + Q[(n-1)/2]+=k; + } +} + +int main() +{ + freopen("C-large.in", "r", stdin); + freopen("C-large.out", "w", stdout); + int TEST; + scanf("%d", &TEST); + for(int i=1; i<=TEST; i++) + { + //cerr << i << endl; + printf("Case #%d: ", i); + _main(i); + } + return 0; +} diff --git a/2017/8 April/Solutions/fashion.cpp b/2017/8 April/Problem D/fashion.cpp similarity index 82% rename from 2017/8 April/Solutions/fashion.cpp rename to 2017/8 April/Problem D/fashion.cpp index 00706de4133a549c50d0ae4213c2fd9a4112f229..79b1fb02f61e74e87408cb832d45d92bc9b7abc6 100644 --- a/2017/8 April/Solutions/fashion.cpp +++ b/2017/8 April/Problem D/fashion.cpp @@ -68,6 +68,26 @@ bool isLegalColumn(vector<vector<char>>& grid, int columnNum) { case '.': continue; case 'x': + case 'o': + if (lastWasOut) + return false; + lastWasOut = true; + break; + case '+': + lastWasOut = false; + } + } + return true; +} + +bool isLegalDiagonal(vector<vector<char>>& grid, int columnNum, int rowNum) { + bool lastWasOut = false; + int c = columnNum + rowNum; + for (int i = 0; i <= c; i++) { + switch(grid[i][c-i]) { + case '.': + continue; + case '+': case 'o': if (lastWasOut) return false; @@ -77,8 +97,8 @@ bool isLegalColumn(vector<vector<char>>& grid, int columnNum) { lastWasOut = false; } } + int c = return true; -} void doStuff(vector<vector<char>>& grid) { int score = calculateScore(grid); diff --git a/2017/8 April/Problem D/main.cpp b/2017/8 April/Problem D/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7590320b23fce5727a4bce2a57849460c2ee59d5 --- /dev/null +++ b/2017/8 April/Problem D/main.cpp @@ -0,0 +1,104 @@ +#include <bits/stdc++.h> + +using namespace std; + +int N, M; +int ta[100][100]; +int tb[100][100]; +int ch[100][100]; + +void _main(int TEST) +{ + memset(ta, 0, sizeof ta); + memset(tb, 0, sizeof tb); + memset(ch, 0, sizeof ch); + scanf("%d%d", &N, &M); + map<int, int> diag1, diag2, axis1, axis2; + for(int i=0; i<N; i++) + for(int j=0; j<N; j++) + diag1[i+j]=diag2[i-j]=axis1[i]=axis2[j]=1; + char c; + for(int i=0; i<M; i++) + { + int x, y; + scanf(" %c%d%d", &c, &x, &y); + x--, y--; + if(c!='x') + diag1[x+y]=diag2[x-y]=0, tb[x][y]++; + if(c!='+') + axis1[x]=axis2[y]=0, ta[x][y]++; + } + map<int, int> m; + for(int i=0; i<N; i++) + for(int j=0; j<N; j++) + m[i+j]++; + vector<pair<int, int>> v; + for(auto& it: m) + v.push_back({it.second, it.first}); + sort(v.begin(), v.end()); + for(int i=0; i<(int)v.size(); i++) + { + int s=v[i].second; + if(diag1[s]==0) + continue; + for(int x=0; x<N; x++) + { + int y=s-x; + if(y<0 || y>=N) + continue; + if(diag2[x-y]) + { + diag1[x+y]=diag2[x-y]=0; + tb[x][y]++; + ch[x][y]=1; + break; + } + } + } + for(int i=0; i<N; i++) if(axis1[i]) + { + for(int j=0; j<N; j++) if(axis2[j]) + { + axis1[i]=axis2[j]=0; + ta[i][j]++; + ch[i][j]=1; + break; + } + } + int ans=0; + vector<pair<char, pair<int, int>>> rans; + for(int i=0; i<N; i++) + for(int j=0; j<N; j++) + { + ans+=ta[i][j]+tb[i][j]; + if(ch[i][j]) + { + if(ta[i][j] && tb[i][j]) + rans.push_back({'o', {i+1, j+1}}); + else if(ta[i][j]) + rans.push_back({'x', {i+1, j+1}}); + else if(tb[i][j]) + rans.push_back({'+', {i+1, j+1}}); + else + assert(0); + } + } + printf("%d %d\n", ans, (int)rans.size()); + for(auto& it: rans) + printf("%c %d %d\n", it.first, it.second.first, it.second.second); +} + +int main() +{ + freopen("D-large.in", "r", stdin); + freopen("D-large.out", "w", stdout); + int TEST; + scanf("%d", &TEST); + for(int i=1; i<=TEST; i++) + { + //cerr << i << endl; + printf("Case #%d: ", i); + _main(i); + } + return 0; +} diff --git a/2017/8 April/Solutions/bathroom.cpp b/2017/8 April/Solutions/bathroom.cpp deleted file mode 100644 index 86805bb9bb3f63d00e7c99e8dc335807d96d31f1..0000000000000000000000000000000000000000 --- a/2017/8 April/Solutions/bathroom.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include <cstdint> -#include <iostream> -#include <array> - -using namespace std; - -array<uint64_t, 2> bathroom(uint64_t k, uint64_t n) { -} - -int main() -{ - int numCases = 0; - cin >> numCases; - - for (int q = 0; q < numCases; q++) - { - uint64_t k = 0; - cin >> k; - - uint64_t n = 0; - cin >> n; - - uint64_t highest = 0; - - uint64_t lowest = 0; - - auto thing = bathroom(k, n); - - highest = thing[0]; - lowest = thing[1]; - - cout << "Case #" << q+1 << ": " << highest << " " << lowest << endl; - } - return 0; -}