T1:暴力map就行了,1遍AC;
T2:看上去很吓人,到分析下题目就发现,他只能按顺序去,从头到尾遍历就行了,一遍AC;
T3:写了一个暴力,正解找规律没找到,TLE35分;
T4:考试时想用贪心,但最后一种情况没想出来,就没提交,正解跟我前面出不多,0分;
题解:
T1:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
int a;
map<int, int> mp;
signed main()
{
freopen("A.in", "r", stdin);
freopen("A.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a;
//判断当前数值a是否已经出现过
if (mp[a] != 0)
{
// 如果出现过,输出它第一次出现的位置mp[a]
cout << mp[a] << " ";
}
else
{
// 如果是第一次出现,输出-1
cout << "-1" << " ";
}
// 记录当前数值a的出现位置i
mp[a] = i;
}
return 0;
}
T2:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
int m;
int x[100005];
int y[100005];
int z[5005];
int vis[100005];
signed main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> x[i] >> y[i];
}
for (int i = 1; i <= m; i++)
{
cin >> z[i];
vis[z[i]] = 1; // 将该点标记为传送点
}
int ans = 0;
// 遍历所有点(从第2个点开始)计算最短路径
for (int i = 2; i <= n; i++)
{
// 如果前一个点(i-1)是传送点,则跳过该段路径计算
if (vis[i - 1] == 1)
{
continue;
}
else
{
int k = 1e9;
// 计算从点(i-1)到所有特殊点的曼哈顿距离,找出最小值
for (int j = 1; j <= m; j++)
{
k = min(k, abs(x[i - 1] - x[z[j]]) + abs(y[i - 1] - y[z[j]]));
}
k = min(k, abs(x[i] - x[i - 1]) + abs(y[i] - y[i - 1]));
ans += k;
}
}
cout << ans;
return 0;
}
T3:
// 包含标准库头文件
#include <bits/stdc++.h>
#define int long long
using namespace std;
int l, r;
signed main()
{
freopen("count.in", "r", stdin);
freopen("count.out", "w", stdout);
int T;
cin >> T;
while (T--)
{
cin >> l >> r;
int ans = 0;
int l1 = l, r1 = r, l2 = l, r2 = r;
// 调整l1为区间内第一个奇数
if (l % 2 == 0)
{
l1++;
}
if (r % 2 == 0)
{
r1--;
}
// 使用等差数列求和公式计算所有奇数的总和
ans = ans + (r1 + l1) * ((r1 - l1) / 2 + 1) / 2;
// 调整l2为区间内第一个能被4整除的数
if (l % 4 == 1)
{
l2 += 3;
}
if (l % 4 == 2)
{
l2 += 2;
}
if (l % 4 == 3)
{
l2 += 1;
}
// 调整r2为区间内最后一个能被4整除的数
if (r % 4 == 1)
{
r2 -= 1;
}
if (r2 % 4 == 2)
{
r2 -= 2;
}
if (r2 % 4 == 3)
{
r2 -= 3;
}
// 使用等差数列求和公式计算所有能被4整除的数的总和
ans = ans + (r2 + l2) * ((r2 - l2) / 4 + 1) / 2;
cout << ans << endl;
}
return 0;
}
T4:
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
freopen("guru.in", "r", stdin);
freopen("guru.out", "w", stdout);
int T;
cin >> T;
while (T--)
{
int n, a, b, x, y, z;
cin >> n >> a >> b >> x >> y >> z;
// 如果提升a级的消耗(a*z)提升b级的消耗(b*y)
if (a * z < b * y)
{
swap(a, b);
swap(y, z);
}
int ans = 1e18;
// 情况1:1级1级升更划算
if (a * x <= y && b * x <= z)
{
ans = n * x;
}
// 情况2,3,4:混合升级
else if (a * x > y && b * x <= z)
{
ans = n / a * y + (n % a) * x;
}
else if (n / a < a)
{
for (int i = 0; i * a <= n; ++i)
{
int k = n - i * a;
int cost = i * y + (k / b) * z + (k % b) * x;
ans = min(ans, cost);
}
}
else
{
for (int i = 0; i * b <= n && i < a; ++i)
{
int k = n - i * b;
int cost = i * z + (k / a) * y + (k % a) * x;
ans = min(ans, cost);
}
}
cout << ans << "\n";
}
return 0;
}