20200212DLUT寒假训练赛div2-atcoderCD*4

20200212DLUT寒假训练赛div2-atcoderCD*4

比赛链接

C - たくさんの数式 / Many Formulas

dfs,每次枚举断开或者不断开两种情况,断开的话就将当前记录的和塞入数组内,不断开就*10+字符值-‘0’,最后如果深度到达了字符串给定的长度就将数组和记录到result变量中

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>

using namespace std;

long long result;
int len;

char orin[100];
long long temp[100];

void dfs(int x, long long sum,int cnt)
{
	if (x == len)
	{
		temp[cnt] = sum;
		for (int i = 1; i <= cnt; ++i)
			result += temp[i];
		return;
	}
	temp[cnt] = sum;
	dfs(x + 1, orin[x] - '0',cnt+1);
	if (sum)
		dfs(x + 1, sum * 10 + orin[x] - '0',cnt);
}


int main(void)
{
	scanf("%s", orin);
	len = strlen(orin);
	dfs(0, 0,0);
	printf("%lld", result);
}

D - すぬけ君の塗り絵 / Snuke’s Coloring

根据每次黑块的位置,使以它为中心的九宫格的方块量都加1(这样的话如果以这些以黑块为中心的九宫格内的方块再为中心的话,黑块数量就多1),用map进行记录,再对个数进行处理,输出结果即可

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<map>

using namespace std;
typedef pair<int, int> T;
map<T, int>s;
int H, W, N;

int dir[9][2] = { -1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1,0,0 };

void Fill(int x, int y)
{
	for (int i = 0; i < 9; ++i)
	{
		int tx = x + dir[i][0], ty = y + dir[i][1];
		if (tx<2 || ty<2 || tx>H - 1 || ty>W - 1) continue;
		++s[T{ tx,ty }];
	}
}

int result[10];

long long sum;

int main(void)
{
	scanf("%d%d%d", &H, &W, &N);
	int a, b;
	for (int i = 0; i < N; ++i)
	{
		scanf("%d%d", &a, &b);
		Fill(a, b);
	}
	sum = ((long long)H - 2) * ((long long)W - 2);
	for (auto i = s.begin(); i != s.end(); ++i)
	{
		++result[i->second];
		--sum;
	}
	printf("%lld\n", sum);
	for (int i = 1; i <= 9; ++i)
		printf("%d\n", result[i]);
}

E - AtCoDeerくんと選挙速報 / AtCoDeer and Election Report

是一个倍率不断增大的过程,如果当前数字小于比例数字的话,那倍率就为1,如果大于的话,就使倍率为当前数字除以比例数字再向上取整,倍率要取两个数字间的最大值

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>

using namespace std;

long long zheng(long long int a, long long int b)
{
	if (a % b == 0)
		return a / b;
	return a / b + 1;
}

int main(void)
{
	long long int a, b, T, ta, tb, rate;
	scanf("%lld", &T);
	a = b = 1;
	while (T--)
	{
		scanf("%lld%lld", &ta, &tb);
		rate = 1;
		if (a >= ta)
			rate = zheng(a, ta);
		if (b >= tb)
		{
			long long t = zheng(b, tb);
			rate = rate > t ? rate : t;
		}
		a = ta * rate;
		b = tb * rate;
	}
	printf("%lld", a + b);
}

F - AtCoDeerくんと変なじゃんけん / AtCoDeer and Rock-Paper

水题,简单模拟即可,能出布就出布

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>

using namespace std;

char orin[100005];

int main(void)
{
	int grades = 0, ok = 0;
	scanf("%s", orin);
	for (int i = 0; orin[i]; ++i)
	{
		if (orin[i] == 'g')
		{
			if (ok)
			{
				++grades;
				--ok;
			}
			else
				++ok;
		}
		else
		{
			if (ok)
				--ok;
			else
			{
				--grades;
				++ok;
			}
		}
	}
	printf("%d", grades);
}

G - 一次元リバーシ / 1D Reversi

水题,看有多少个相邻的石头颜色不同即可

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>

using namespace std;

char orin[100005];

int main(void)
{
	int cnt = 0;
	scanf("%s", orin);
	for (int i = 1; orin[i]; ++i)
	{
		if (orin[i] != orin[i - 1])
			++cnt;
	}
	printf("%d", cnt);
}

H - 高橋君と見えざる手 / An Invisible Hand

每次记录当前遇到的最小值和当前值减去最小值的利润的最大值,并用map记录这样的利润最大值出现过多少次,最后输出利润最大值的出现次数即可,注意每个数都是不一样的

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<map>

using std::map;
using std::max;
using std::min;
int a[100005];
map<int, int> s;

int main(void)
{
	int N, T,profit = 0,jiujimin = 0x7fffffff;
	scanf("%d%d", &N, &T);
	for (int i = 0; i < N; ++i)
		scanf("%d", &a[i]);
	for (int i = 0; i < N; ++i)
	{
		if (a[i] < jiujimin)
			jiujimin = a[i];
		else
		{
			if (a[i] - jiujimin > profit)
			{
				profit = a[i] - jiujimin;
				++s[profit];
			}
			else if (a[i] - jiujimin == profit)
				++s[profit];
		}

	}
	if (!profit)
		printf("%d", N);
	else
		printf("%d",s[profit]);
}

A题dp还不会,B题数论也不会,hhh

发布了8 篇原创文章 · 获赞 0 · 访问量 197

猜你喜欢

转载自blog.csdn.net/qq_45961715/article/details/104280402