A. Sum of 2050
题意:判断一个数是不是能由2050或者是205010^i构成,求构成所需要的最小的2050的个数是多少。
思路:首先判断-1的情况,就是n%2050!=0,然后每次都想用n减去205010^i中i最大的情况。
#define int long long signed main() { int n, i, j, t; cin >> t; while (t--) { cin >> n; int ans = 0; if (n % 2050 == 0) { int cnt=0; while(n!=0){ int d1=0; for(i=0;;i++){ d1=2050*quickpow(10,i); if(d1>n) break; } n-=2050*quickpow(10,i-1); cnt++; } cout<<cnt<<endl; } else { scf1; } } return 0; }
B. Morning Jogging
题意:其实就是要保证每个所在的行不能移动的情况下,使每一列都有最小的数。
思路:感觉做的复杂了,大概用的map里嵌套pair标机这个位置有没有被放置过,然后优先排序之后最小的挨个放完,再把没放的顺序放下来。
const int maxn = 105; int ans[maxn][maxn]; int h[maxn]; map<int, int >mo; struct node { int v; int idx; } a[maxn * maxn]; bool cmp(node a, node b) { return a.v < b.v; } int main() { int n, m, i, j, t; cin >> t; while (t--) { memset(h, 0, sizeof(h)); cin >> n >> m; int cnt = 0; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { cin >> a[cnt].v; a[cnt].idx = i; cnt++; } } sort(a, a + cnt, cmp); map<pair<int ,int > , int >mm; for (i = 0; i < cnt; i++) { if (i < m) { ans[a[i].idx][i] = a[i].v; mm[make_pair(a[i].idx, i)]++; } else { for (j = 0; j < m; j++) { if (mm[make_pair(a[i].idx, j)] == 0) { ans[a[i].idx][j] = a[i].v; mm[make_pair(a[i].idx, j)] = 1; break; } } } } for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { cout << ans[i][j] << " "; } cout << endl; } } return 0; }
C. Fillomino 2
题意:给出一个矩形的主对角线上的所有值,然后你要挨着填这些数,使得相同的数字n要有n个且必须要相邻,例子如下:
思路:其实很容易想,优先往左填,填不了就往下,哎,比赛的时候想的差不多了,但是实现错了太困了就睡着了=。=
#include<iostream> #include<map> #define bugg(a,b) cout<<a<<" "<<b<<endl; using namespace std; int mp[505][505]; int a[505]; int n; void pf() { int i, j; for (i = 1; i <= n; i++){ for (j = 1; j <= i-1; j++) { cout << mp[i][j] << " "; } cout << mp[i][j] << endl; } } bool jg(int x, int y) { if (x > 0 && y <= n && y > 0 && x <= n) { if (mp[x][y] == 0) { return true; } else return false; } else return false; } void pull (int n,int i){ int x=i, y=i; int cnt = n-1; while (cnt--) { if (jg(x, y-1) == 1) { mp[x][y-1] = n; y--; } else { mp[x+1][y] = n; x++; } } } int main() { int i, j, d; cin >> n; for (i = 1; i <= n; i++) { cin >> a[i]; mp[i][i] = a[i]; } for (i = 1; i <= n; i++) { pull(a[i],i); } pf(); }