A
高中数学,均值不等式让这三个数字差距越小越好
int a, b, c;
void solve()
{
cin >> a >> b >> c;
vector<int> D;
D.push_back(a);
D.push_back(b);
D.push_back(c);
for (int i = 1; i <= 5;i++)
{
sort(D.begin(),D.end());
D[0]++;
}
cout << D[0] * D[1] * D[2] << endl;
}
B
最终总要合成一个,大的就不分了,排序,已经是1的直接合并,不然就拆开合并
#define int long long
int n, k, A[N];
void solve()
{
cin >> n >> k;
for (int i = 1; i <= k; i++)
cin >> A[i];
sort(A + 1, A + 1 + k);
LL ans = 0;
for (int i = 1; i < k; i++)
{
if (A[i] > 1)
ans += A[i] * 2 - 1;
else
ans += A[i];
}
cout << ans << endl;
}
C
会发现本质是前缀和的前缀和,就让符合f的在前面,符合g的放最后,而且符合g的要从小到大,这样才是最小
int n, m, k, A[N];
void solve()
{
cin >> n >> m >> k;
for (int i = n; i > m; i--)
{
cout << i << " ";
}
for (int i = 1; i <= m; i++)
{
cout << i << " ";
}
cout << endl;
}
D
dp[i]的意思是走的第i个位置所需要的最小步数,如果dp[i] == inf, 证明无法走到
int n, m, k;
string s;
void solve()
{
cin >> n >> m >> k;
cin >> s;
s = "L" + s;
vector<int> dp(n + 4, inf);
dp[0] = 0;
for (int i = 1; i <= n + 1; i++)
{
if (s[i] == 'C')
continue;
int j = i;
int mi = dp[i - 1];
for (int kk = 1; kk <= m; kk++)
{
j--;
if (j < 0)
break;
if (s[j] != 'L')
continue;
mi = min(mi, dp[j]);
j--;
}
// cout << endl;
if (s[i] == 'W')
mi++;
dp[i] = mi;
}
// for (int i = 0; i <= n + 1; i++)
// {
// cout << dp[i] << "==" << endl;
// }
// cout << endl;
if (dp[n + 1] <= k)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
E
会发现n*a最大是1e6, 所以最后得到的答案位数最多也是6位,遍历a,再得到b的范围然后枚举一下,|n|*a-b < 6&&|n|*a>b, 所以得到b的范围为|n|*a-5 — |n|*a-1,(|n| 为 n的长度)。
int n;
void solve()
{
cin >> n;
string s = to_string(n);
int len = s.length();
vector<pair<int, int>> ans;
for (int a = 1; a <= 10000; a++)
{
int mi = max(1, len * a - 5);
int ma = len * a;
for (int b = mi; b < ma; b++)
{
int x = n * a - b;
int y = 0;
for (int i = 0; i < len * a - b; i++)
{
y = y * 10 + s[i % len] - '0';
}
if (x == y)
ans.push_back({a, b});
}
}
cout << ans.size() << endl;
for (auto y : ans)
{
cout << y.first << " " << y.second << endl;
}
}
F
可以先把x的因数记录一下, x<1e5, d(x) <= 128. 利用map进行dp, dp[i] 代表这些数字的子集乘积是否可以得到i, 最后如果有剩余要ans++, 注意dp的时候要先存起来, 结束了再赋回去, 用count判断有没有, 直接[]==, 会给他记录到,就这样被hack了。。。。
#define int long long
int n, x, A[N];
void solve()
{
cin >> n >> x;
for (int i = 1; i <= n; i++)
cin >> A[i];
map<int, int> D, E;
int num = 0;
for (int i = 1; i <= x; i++)
{
if (x % i == 0)
{
D[i] = 1;
num++;
}
}
int ans = 0;
int t = 0;
for (int i = 1; i <= n; i++)
{
if (!D.count(A[i]))
{
if (t == 0)
{
E[A[i]] = 1;
t = 1;
}
continue;
}
int op = 0;
map<int, int> F;
for (auto y : D)
{
if (E[y.first])
{
LL num = y.first * A[i];
if (num > x)
continue;
F[num] = 1;
if (num == x)
{
op++;
break;
}
}
}
for (auto y : F)
{
E[y.first] = 1;
}
if (op)
{
ans++;
t = 0;
E.clear();
}
E[A[i]] = 1;
}
int opp = 0;
for (auto y : E)
{
if (E[y.first])
opp++;
}
if (opp)
ans++;
cout << ans << endl;
}