AtCoder Beginner Contest 144
October 27, 2019
前四道签到,至少这次没翻车
A. 9×9
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <functional>
#include <map>
#define M 2001
using namespace std;
int main()
{
int x, y;
cin >> x >> y;
if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
cout << x*y << endl;
else
cout << -1 << endl;
return 0;
}
B. 81
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <functional>
#include <map>
#define M 2001
using namespace std;
int main()
{
int x;
cin >> x;
for (int i = 1; i <= 9; i++)
{
if (x%i != 0)
continue;
int y = x / i;
if (y >= 1 && y <= 9)
{
cout << "Yes" << endl;
return 0;
}
}
cout << "No" << endl;
return 0;
}
C. Walk on Multiplication Table
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <functional>
#include <map>
#define M 2001
using namespace std;
int main()
{
long long x;
cin >> x;
int q = (int)sqrt(x);
long long m, n;
for (int i = q; i >= 1; i--)
{
if (x%i == 0)
{
m = i;
n = x / i;
break;
}
}
cout << m + n - 2 << endl;
return 0;
}
D. Water Bottle
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <functional>
#include <map>
#define M 2001
using namespace std;
int main()
{
int a, b, x, v;
cin >> a >> b >> x;
v = a*a*b;
double Rad_to_deg = 45.0 / atan(1.0);
if (x <= v/2)
{
double tan = double(a)*b*b / (2 * x);
printf("%0.7lf\n", atan(tan)*Rad_to_deg);
}
else
{
double tan = double(v-x)*2/(a*a*a);
printf("%0.7lf\n", atan(tan)*Rad_to_deg);
}
return 0;
}
E. Gluttony
做这道题的时候还有50多分钟,看题目大概猜到了是二分答案,然而当时没有想出来。只能说是不熟练吧,很久没做题大脑像生锈了一样,前四道题就花了40多分钟。其实这道题很简单,只是当时一下子短路了没想到怎么验证解是否可行(可能是受了上周那道题的影响,总想着要建立一个和k有关的不等式)。突然想起当年noip滚粗也是因为d2t1的二分答案,大概我和这类题绝缘吧,所以还是要多做题,下次争取能A5道,至少再碰到二分答案不要放弃。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <functional>
#include <map>
#define M (long long)2e5+10
long long a[M], f[M], m[M];
using namespace std;
bool cmp(const long long a, const long long b)
{
return a > b;
}
int main()
{
long long n, k;
long long maxl = -1;
cin >> n >> k;
for (long long i = 1; i <= n; i++)
cin >> a[i];
for (long long i = 1; i <= n; i++)
cin >> f[i];
sort(a + 1, a + n + 1);
sort(f + 1, f + n + 1, cmp);
for (long long i = 1; i <= n; i++)
{
m[i] = a[i] * f[i];
maxl = max(maxl, m[i]);
}
long long l = 0, r = maxl, mid;
while (l <= r)
{
mid = (l + r) >> 1;
long long tot = 0;
for (long long i = 1; i <= n; i++)
if (m[i] > mid)
tot += a[i] - mid / f[i];
if (tot > k)
l = mid + 1;
else
r = mid - 1;
}
cout << l << endl;
return 0;
}
F. Fork in the Road
典型的dp,考场上没时间想了,再加上本身也不熟,下次加油吧,感觉1500至少能进个700名。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <functional>
#include <map>
#define M 605
using namespace std;
int n, m;
double f[M], a[M], ans;
vector<int>G[M];
double dfs(int u)
{
if (u == n)
return 0;
if (f[u] != 0)
return f[u];
for (int v : G[u])
f[u] += dfs(v);
return f[u] = f[u] / G[u].size() + 1;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y;
G[x].push_back(y);
}
dfs(1);
a[1] = 1;
for (int i = 1; i < n; i++) //经过第i个点的概率
for (int j : G[i])
a[j] += a[i] / G[i].size();
for (int i = 1; i < n; i++)
if (G[i].size() > 1)
{
double tmp = 0;
for (int j : G[i])
tmp += f[j];
for (int j : G[i])
ans = max(ans, a[i] * (f[i] - ((tmp - f[j]) / (G[i].size() - 1) + 1)));
}
printf("%.10f\n", f[1] - ans);
return 0;
}