20200222DLUT寒假训练赛
F - String
即统计avin各个字母出现的次数,然后简单排列组合,算出avin出现的次数和所有排列次数,寻找到最大公因数进行约分
#include<cstdio>
#include<algorithm>
#include<cstring>
char orin[105];
int exist[4];
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
int main(void)
{
//freopen("abc.in", "r", stdin);
int n, cnt = 0;
scanf("%d%s", &n, &orin);
for (int i = 0; i < n; ++i)
{
if (orin[i] == 'a')
++exist[0];
else if (orin[i] == 'v')
++exist[1];
else if (orin[i] == 'i')
++exist[2];
else if (orin[i] == 'n')
++exist[3];
}
if (exist[0] && exist[1] && exist[2] && exist[3])
{
n *= n;
n *= n;
int cnt = exist[0] * exist[1] * exist[2] * exist[3];
int t = gcd(n, cnt);
printf("%d/%d\n", cnt / t, n / t);
}
else
printf("0/1\n");
}
G - Traffic
暴力枚举等待的时间,使得a和b两个数组无交集时即可输出答案
#include<cstdio>
#include<algorithm>
#include<cstring>
int b[1005], t;
int vis[3000];
int main(void)
{
//freopen("abc.in", "r", stdin);
int n, m;
while (~scanf("%d%d", &n, &m))
{
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; ++i)
{
scanf("%d", &t);
vis[t] = 1;
}
for (int i = 0; i < m; ++i)
scanf("%d", &b[i]);
int result = -1;
bool flag = 0;
while (!flag)
{
flag = 1;
++result;
for (int i = 0; i < m; ++i)
if (vis[b[i] + result])
{
flag = 0;
break;
}
}
printf("%d\n", result);
}
}
I - Budget
由于数据可以达到1e18,所以用字符串进行存储,根据最后一位的数字i,>=5则加上10-i,<5则减去i,输出结果即可
#include<cstdio>
#include<algorithm>
#include<cstring>
char tmp[100];
int t;
int main(void)
{
//freopen("abc.in", "r", stdin);
int n, a;
double total = 0;
while (~scanf("%d", &n))
{
while (n--)
{
scanf("%s", &tmp);
a = tmp[strlen(tmp) - 1] - '0';
if (a <= 4)
total -= a;
else
total += 10 - a;
}
total *= 1e-3;
printf("%.3f\n", total);
}
}
J - Worker
即求出每个工厂要求产量的最小公倍数,看作一大份,在用这个公倍数除以每个工厂的要求产量,将其看作一小份,最后用总人数除以最小公倍数算出有多少个大份再乘以每个工厂的一小份算出每个工厂需要的工人数
#include<cstdio>
#include<algorithm>
#include<cstring>
long long int gcd(long long int a, long long int b)
{
return b ? gcd(b, a % b) : a;
}
long long int a[1005];
int main(void)
{
//freopen("abc.in", "r", stdin);
long long int n, m,t;
scanf("%lld%lld", &n, &m);
for (int i = 0; i < n; ++i)
scanf("%lld", &a[i]);
long long int yue = gcd(a[0], a[1]);
yue = a[0] * a[1] / yue;
long long int total = 0;
for (int i = 2; i < n; ++i)
{
t = gcd(yue, a[i]);
yue = yue * a[i] / t;
}
for (int i = 0; i < n; ++i)
total += yue / a[i];
if (m % total == 0)
{
printf("Yes\n");
for (int i = 0; i < n - 1; ++i)
printf("%lld ", m / total * yue / a[i]);
printf("%lld\n", m / total * yue / a[n - 1]);
}
else
printf("No\n");
}
K - Class
水题,解方程
#include<cstdio>
#include<algorithm>
int main(void)
{
//freopen("abc.in", "r", stdin);
int a, b,c,d;
scanf("%d%d", &a, &b);
c = (a + b) / 2;
d = a - c;
printf("%d\n", c * d);
}