模考总结10月25.wwz

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;
}
1 个赞