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