Codeforces 687(Div2)

题目链接 http://codeforces.com/contest/1457

A题

解法:枚举四个顶点,最远点肯定是这四个之一。

#include 

using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;

int main()
{
    int n,t,m,r,c;
    cin>>t;
    while(t--)
    {
        cin>>n>>m>>r>>c;
        int maxm=0;
        maxm=max(maxm,abs(1-r)+abs(1-c));
        maxm=max(maxm,abs(n-r)+abs(m-c));
        maxm=max(maxm,abs(1-r)+abs(m-c));
        maxm=max(maxm,abs(n-r)+abs(1-c));
        cout<

B题

解法:暴力枚举刷成每种颜色需要的天数。规模在10的7次方,轻松解决。不过此题可能有高效解法(DP?)

#include 

using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int a[maxn];
int b[maxn];
int k, n;
void fenshua(int be, int c)
{
    for (int i = be, j = 0; i < n && j < k; j++, i++)
    {
        b[i] = c;
    }
}
int solve(int color)
{
    int r = 0;
    for (int i = 0; i < n; i++)
    {
        if (b[i] != color)
        {
            fenshua(i, color);
            r++;
        }
    }
    return r;
}
int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {

        scanf("%d%d", &n, &k);
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
        }
        int ans = 110000;
        for (int i = 1; i <= 100; i++)
        {
            for (int j = 0; j < n; j++)
                b[j] = a[j];

            int day = solve(i); //刷成每一种所需的天数
            // cout << day << endl;
            ans = min(ans, day);
        }
        printf("%d\n", ans);
    }

    return 0;
}

C题

题意:

一些cell,cell上可能存在平台

玩家必须从左边投球,使球首先落在cell的一个平台上。之后弹到下一个平台(p+k),之后是p+2k,以此类推,直到超过终点

注意:如果这些cell上不存在平台,你不能通过。

 

有两种操作:

x秒添加一个平台

y秒删除一个cell,减少第一个cell,并且重新编号其后的细胞(换句话说,用这个操作可以让某个cell无效化)

注意,不允许cell数量小于p

最小化时间

解法:删除第一个单元格等价于p+1。枚举删除前几个cell,并且计算每次补平台的花销。防止超时,对补平台的花销进行预处理,从后往前计算。

(比赛时候读错题可还行,我以为跳的时候可以随便删除。)

#include 

using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;

string cell;
int n, p, k;
int x, y;
int price[maxn];//时间花费
void pre()
{
    for (int i = n - 1; i >= 0; i -= k)
    {
        for (int j = 0, m = i; j < k&&m>=0; j++, m--)
        {
            if (cell[m] == '0')
                price[m] = x;
            if (i != n - 1)
                price[m] += price[m + k];
        }
    }
}

int main()
{
    ios::sync_with_stdio(0);//注意,关闭流同步之后不要用printf
    int t;
    cin >> t;
    while (t--)
    {

        cin >> n >> p >> k;
        cin >> cell;
        cin >> x >> y;

        int ans = INT_MAX;
        for (int i = 0; i < n; i++)
            price[i] = 0;
        pre();

        for (int i = 0; i < n && i + p - 1 < n; i++)
        {
            ans = min(ans, price[i + p - 1] + i * y);
        }
        cout << ans << endl;
    }
    return 0;
}

 

你可能感兴趣的:(题解)