Codeforces Round #601 (Div. 2)

A. Changing Volume

这道题都转化为从小到大求解。优先按大的按钮就可以。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
 
void solve()
{
    LL a, b;
    cin >> a >> b;
    if(a > b) swap(a, b);
    long long ret = 0;
    LL diff = b - a;
    while(diff)
    {
        if(diff / 5)
        {
            ret += diff / 5;
            diff %= 5; 
        }
        if(diff / 2)
        {
            ret += diff / 2;
            diff %= 2; 
        }
        if(diff / 1)
        {
            ret += diff / 1;
            diff %= 1; 
        }
    }
    cout << ret << endl;
}
 
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        solve();
    }
    return 0;
}

B. Fridge Lockers

这道题改了好几次题目。最重要的就是每个点要和另外两个不同的点连接。所以每个点至少要连两条边。每个点的值都会至少加两遍。后面题目改为 n<=m。n<m和n<3的时候肯定没有解。n==m的时候,只能连成一个环。这样每个点的值都加了两遍。

#include<bits/stdc++.h>
using namespace std;
 
void solve()
{
    int n, m;
    cin >> n >> m;
    int sum = 0;
    for(int i = 0; i < n; i++)
    {
        int x;
        cin >> x;
        sum += x;
    }
    if(n > m || n < 3) 
    {
        cout << -1 << endl;
        return;
    }
    cout << sum * 2 << endl;
    for(int i = 1; i <= n; i++)
    {
        if(i == 1)
        {
            cout << n << ' ' << 1 << endl;
            continue;
        }
        cout << i - 1 << ' ' << i << endl;
    }
    return;
}
 
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        solve();
    }
    return 0;
}

C. League of Leesins

对于一个序列(1,4,2,3,5)。每三个一组分为(1,4,2), (4,2,3), (2,3,5)。每组内部可以调换顺序,组之间也可以调换顺序。最后得到(4,3,2), (2,3,5),(4,1,2)。如何根据最后的数据得到最初的序列。

可以观察到1,5出现了一次。4,3出现了两次。1,5肯定是首尾元素。其实是无法确定哪个是开头的。就认为1是开头的。(4,1,2)肯定就是前三个元素。2出现了三次,4出现了两次。所以4肯定是第二个元素。知道了第一个元素1和第二个元素4就能推出第三个元素2。再根据4和2就能推出下一个元素3。从而可以推出整个序列。

#include<bits/stdc++.h>
using namespace std;

const int N = 1000010;
int h[N], e[N], ne[N], idx;
int x, y, z, cnt[N];
bool st[N];
void add(int a, int b)
{
    e[idx] = b; ne[idx] = h[a]; h[a] = idx++;
}

int main()
{
    memset(h, -1, sizeof h);
    int n;
    cin >> n;
    for(int i = 0; i < n - 2; i++)
    {
        cin >> x >> y >> z;
        add(x, y);
        add(x, z);
        add(y, x);
        add(y, z);
        add(z, x);
        add(z, y);
        cnt[x]++;
        cnt[y]++;
        cnt[z]++;
    }
    for(int i = 1; i <= n; i++)
        if(cnt[i] == 1)
        {
            x = i;
            st[x] = true;
            break;
        }
    cout << x << ' ';    
    for(int i = h[x]; i != -1; i = ne[i])
    {
        y = e[i];
        if(cnt[y] == 2)
        {
            st[y] = true;
            break;
        }
    }
    cout << y << ' ';
    for(int i = 0; i < n - 2; i++)
    {
        for(int i = h[x]; i != -1; i = ne[i])
        {
            z = e[i];
            if(!st[z]) break;
        }
        cout << z << ' ';
        st[z] = true;
        x = y;
        y = z;
    }
    return 0;
}

D. Feeding Chicken

没思路。过几天看看题解再做吧。

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