AtCoder Beginner Contest 160

A - Coffee

签到,判断形如caffee一样的单词,34字母相同,56字母相同

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>

using namespace std;

int main()
{
    string s;
    cin >> s;
    if (s.length() == 6 && s[2] == s[3] && s[4] == s[5])
        cout << "Yes\n";
    else cout << "No\n";
    
    return 0;
}

B - Golden Coins

贪心,能用500换1000的幸福点,就用500,剩下的用5换5

#include <iostream>
#include <cstdio>
#pragma warning(disable:4996)
using namespace std;

int main()
{
    int n; scanf("%d", &n);
    long long ans = 0;
    int k1 = n / 500;
    ans += k1 * 1000;
    n %= 500;
    ans += 5 * (n / 5);
    printf("%lld", ans);
    
    return 0;
}

C - Traveling Salesman around Lake

题意

长度为k的圆上有n个房子,求经过每个房子需要走的最短路径

思路

 
求出相邻房子之间距离的最大值,注意第n号房子与第1号房子距离的计算,然后用k-max_dist
代码

 

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

const int N = 2e5 + 5;

int a[N];

int main()
{
    int k, n;
    cin >> k >> n;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    sort(a + 1, a + n + 1);
    int res = 0;
    for (int i = 2; i <= n; ++i)
        res = max(res, a[i] - a[i - 1]);
    res = max(k - a[n] + a[1], res);
    cout << k - res << endl;
    system("pause");
    return 0;
}

 

D:Line++

题意:
n个点,每个点与他前一个点相连,给出不相邻两点X,Y他们之间连也一条边
思路:
暴力计算两点之间的距离,未加入点前 i , j 两点距离为 j - i
加X,Y后,更新i,j两点的距离,dis[i][j] = min(dis[i][x] + dis[y][j] +1,dis[i][j]);
最后统计相同路径长的数量
代码:
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 2e3 + 5;

int e[N][N], ans[N];

int main()
{
    int n, x, y;
    cin >> n >> x >> y;
    for (int i = 1; i <= n; ++i) {
        for (int j = i + 1; j <= n; ++j) {
            e[j][i] = e[i][j] = j - i;
        }
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = i + 1; j <= n; ++j) {
            e[i][j] = e[j][i] = min(e[i][x] + e[y][j] + 1, e[i][j]);
        }
    }
    for (int i = 1; i <= n; ++i)
        for (int j = i + 1; j <= n; ++j)
            ans[e[i][j]]++;
    for (int i = 1; i < n; ++i)
        cout << ans[i] << endl;
    system("pause");
    return  0;
}

 

E: Red and Green Apples

题目:
红苹果,绿苹果各A,B个,每个苹果对应有自己的美味值,还有C个无色苹果,可以变成红苹果或绿苹果,求吃X个红苹果,Y个绿苹果的最大美味值。
思路:
贪心。这是什么三指针??我好像没学。瞎写一下

A,B,C苹果排个序,取前X,Y个红苹果和绿苹果,用无色苹果的当前最大值(比如第k个无色苹果最大)比较A,B种最小的值(设为红色第i个,绿色第j个最小),如果c[k]>a[i],c[k]>b[j],则c[k]替换掉a[i],b[j]种较小的那个,因为假设a[i]<b[j]那么替换后增加的美味值为c[k]-a[i]>c[k]-b[j]。

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>

using namespace std;
typedef long long ll;

const int N = 1e5 + 5;

int a[N], b[N], c[N];
int x, y, A, B, C;

bool mycmp(int x, int y)
{
    return x > y;
}

int main()
{
    cin >> x >> y >> A >> B >> C;
    for (int i = 1; i <= A; ++i) cin >> a[i];
    for (int i = 1; i <= B; ++i) cin >> b[i];
    for (int i = 1; i <= C; ++i) cin >> c[i];
    sort(a + 1, a + A + 1, mycmp);
    sort(b + 1, b + B + 1, mycmp);
    sort(c + 1, c + C + 1, mycmp);
    int Amin = x, Bmin = y, Cmax = 1;
    while (Cmax <= C && Amin >= 1 && Bmin >= 1)
    {
        int am = a[Amin], bm = b[Bmin], cmx = c[Cmax];
        if ( am <= cmx &&  bm <= cmx )
        {
            if (a[Amin] <= b[Bmin]) {
                a[Amin] = cmx;
                Amin--; Cmax++;
            }
            else {
                b[Bmin] = cmx;
                Bmin--; Cmax++;
            }
        }
        else if (am <= cmx) {
            a[Amin] = cmx;
            Amin--; Cmax++;
        }
        else if (bm <= cmx) {
            b[Bmin] = cmx;
            Bmin--; Cmax++;
        }
        else {
            break;
        }
    }
    ll res = 0;
    for (int i = 1; i <= x; ++i)
        res += a[i];
    for (int i = 1; i <= y; ++i)
        res += b[i];
    cout << res << endl;

    return 0;
}

 

 谁能告诉我为啥第七个点WA了

F:Distributing Integers

 

posted @ 2020-03-29 12:28  xiongyuqing  阅读(163)  评论(2)    收藏  举报