Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2)(A-C)

A. Sum of 2050

题意:判断一个数是不是能由2050或者是205010^i构成,求构成所需要的最小的2050的个数是多少。
思路:首先判断-1的情况,就是n%2050!=0,然后每次都想用n减去2050
10^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个且必须要相邻,例子如下:
Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2)(A-C)_第1张图片
思路:其实很容易想,优先往左填,填不了就往下,哎,比赛的时候想的差不多了,但是实现错了太困了就睡着了=。=

#include
#include
#define bugg(a,b) cout<
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();
}

你可能感兴趣的:(codeforces,算法,排序算法)