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();
}