CSP-J 2019 第二輪 複賽簡單解析

第一題:數字遊戲,簽到題

#include <iostream>
#include <cstdio>
using namespace std;

int main() {

    freopen("number.in", "r", stdin);
    freopen("number.out", "w", stdout);
    string s;
    cin >> s;
    
    int ans = 0;
    for (int i = 0; i < 8; ++i)
        if (s[i] == '1')
            ans ++;
    cout << ans << endl;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

 

第二題:公交換乘,模擬題

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
struct Node
{
    long long type, price, t;
} a[200000];

vector<Node> v;

int main()
{

    freopen("transfer.in", "r", stdin);
    freopen("transfer.in", "w", stdout);

    int n;

    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> a[i].type >> a[i].price >> a[i].t;

    long long sum = 0;
    for (int i = 1; i <= n; ++i)
    {

        if (a[i].type == 0)
        {
            sum += a[i].price;
            v.push_back(a[i]);
        }
        else
        {
            bool flag = false;
            for (int j = 0; j < v.size(); ++j)
            {

                if (a[i].t - v[j].t <= 45)
                {
                    if (a[i].price <= v[j].price)
                    {
                        flag = true;
                        v.erase(v.begin() + j);
                        break;
                    }
                }
                else
                {
                    v.erase(v.begin() + j);
                    j--;
                }
            }
            if (!flag)
                sum += a[i].price;
        }
    }
    cout << sum << endl;

    fclose(stdin);
    fclose(stdout);
    return 0;
}

 

第三題:紀念品,揹包問題

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

int t, n, m;
int f[20000];
int a[200][20000];
int main()
{

    freopen("souvenir.in", "r", stdin);
    freopen("souvenir.out", "w", stdout);

    cin >> t >> n >> m;
    
    for (int i = 1; i <= t; ++i)
        for (int j = 1; j <= n; ++j)
            cin >> a[i][j];
    
    for (int i = 2; i <= t; ++i) {
        
        memset(f, 0, sizeof(f));
        for (int j = 1; j <= n; ++j) {
            for (int k = a[i - 1][j]; k <= m; k++) {
                f[k] = max(f[k], f[k - a[i - 1][j]] + a[i][j] - a[i - 1][j]);
            }
        }
        m += f[m];
    }
    cout << m << endl;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

 

第四題:加工零件,圖論,最短路問題

#include <bits/stdc++.h>
using namespace std;
struct Edge
{
     int u, v, next;
} e[400000];
int n, m, u, v, tot, query, f[200000], d[200000][2];
bool used[200000];
queue<int> q;
void add(int u, int v)
{
     tot++;
     e[tot].u = u;
     e[tot].v = v;
     e[tot].next = f[u];
     f[u] = tot;
}
int main()
{
     freopen("work.in", "r", stdin);
     freopen("work.out", "w", stdout);
     cin >> n >> m >> query;
     for (int i = 1; i <= m; ++i)
     {
          cin >> u >> v;
          add(u, v);
          add(v, u);
     }
     memset(d, 0x3f, sizeof(d));
     memset(used, false, sizeof(used));
     d[1][0] = 0;
     used[1] = true;
     q.push(1);
     while (!q.empty())
     {
          int u = q.front();
          q.pop();
          for (int i = f[u]; i > 0; i = e[i].next)
          {
               int v = e[i].v;
               if (d[u][0] + 1 < d[v][1])
               {
                    d[v][1] = d[u][0] + 1;
                    if (!used[v])
                    {
                         used[v] = true;
                         q.push(v);
                    }
               }
               if (d[u][1] + 1 < d[v][0])
               {
                    d[v][0] = d[u][1] + 1;
                    if (!used[v])
                    {
                         used[v] = true;
                         q.push(v);
                    }
               }
          }
          used[u] = false;
     }
     for (int i = 1; i <= query; ++i)
     {
          int a, l;
          cin >> a >> l;
          if ((d[a][0] <= l && l % 2 == 0) || (d[a][1] <= l && l % 2 == 1))
               printf("Yes\n");
          else
               printf("No\n");
     }
     fclose(stdin);
     fclose(stdout);
     return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章