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
題意
思路
程式碼
點選檢視程式碼