A - Automatic Judge
题意
\(n\)个问题,\(m\)条记录,每条记录有题号、时间、状态,第一次\(AC\)的时候计入罚时,其他没发罚\(20\)分钟。求队伍过题数和罚时。
思路
模拟。
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n, m;
cin >> n >> m;
map<string, int> mp;
int cnt = 0, ans = 0;
for (int i = 0; i < m; i++)
{
string r, s, t;
cin >> r >> s >> t;
if (mp[r] == -1)
{
continue;
}
if (t == "AC")
{
cnt++;
ans += mp[r] * 20 + (s[1] - '0') * 60 + (s[3] - '0') * 10 + s[4] - '0';
mp[r] = -1;
}
else
{
mp[r]++;
}
}
cout << cnt << ' ' << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
B - Building Shops
题意
\(n\)个教室,在教室中建超市,在第\(i\)个教室建花费\(c_i\),没建的教室花费为其坐标与其左边最近超市坐标之差。求最少花费。
思路
\(n\)很小,一眼\(dp\)。
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mxn = 3e3 + 5;
struct node
{
int x, c;
bool operator < (const node& a) const
{
return x < a.x;
}
};
int dp[mxn][mxn]; // dp[i][j]表示在[1,i]的教室中最后一个建超市的地方是第j个教室的最小花费
void solve()
{
int n;
while (cin >> n)
{
vector<node> v(n + 1);
for (int i = 1; i <= n; i++)
{
cin >> v[i].x >> v[i].c;
}
sort(v.begin() + 1, v.end());
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
dp[i][j] = 1e18;
}
}
dp[1][1] = v[1].c;
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
dp[i][j] = min(dp[i][j], dp[i - 1][j] + v[i].x - v[j].x); // 不建
dp[i][i] = min(dp[i][i], dp[i - 1][j] + v[i].c); // 在i建
}
}
int ans = LLONG_MAX;
for (int i = 1; i <= n; i++)
{
ans = min(ans, dp[n][i]);
}
cout << ans << endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
C - Coprime Sequence
题意
给定长度为\(n\)的互质序列(所有数的GCD是\(1\)),删一个数使得剩下数的GCD最大。求删数后的最大GCD。
思路
假设答案是\(x\),那\(x\)必须要整除\(n-1\)个数,即有\(n-1\)个数都\(\ge x\),那\(x\)最大就是排序后的第二个数(不一定是第二小),让后往下找到\(1\)即可。
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
sort(v.begin(), v.end());
for (int i = v[1]; i >= 1; i--)
{
int sum = 0;
for (int j = 0; j < n; j++)
{
if (v[j] % i == 0)
{
sum++;
}
if (sum >= n - 1)
{
cout << i << endl;
return;
}
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
D - Deleting Edges
题意
思路
代码
点击查看代码
E - Easy Summation
题意
给定\(n\)和\(k\),以及函数\(f(i) = i^k\)。求\(\sum_{i=1}^n f(i)\)。
思路
快速幂,模拟。
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9 + 7;
int qp(int base, int x)
{
int res = 1;
while (x)
{
if (x & 1)
{
res *= base;
res %= mod;
}
x >>= 1;
base *= base;
base %= mod;
}
return res;
}
void solve()
{
int n, k;
cin >> n >> k;
int ans = 0;
for (int i = 1; i <= n; i++)
{
ans += qp(i, k);
ans %= mod;
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
G - Graph Theory
题意
思路
代码
点击查看代码
H - Happy Necklace
题意
思路
代码
点击查看代码
I - Innumerable Ancestors
题意
思路
代码
点击查看代码