Codeforces Round #256 (Div. 2) 题解

Problem A:

A. Rewards

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Bizon the Champion is called the Champion for a reason.

Bizon the Champion has recently got a present — a new glass cupboard with n shelves
and he decided to put all his presents there. All the presents can be divided into two types: medals and cups. Bizon the Champion has a1 first
prize cups, a2 second
prize cups and a3third
prize cups. Besides, he has b1 first
prize medals, b2 second
prize medals and b3 third
prize medals.

Naturally, the rewards in the cupboard must look good, that‘s why Bizon the Champion decided to follow the rules:

  • any shelf cannot contain both cups and medals at the same time;
  • no shelf can contain more than five cups;
  • no shelf can have more than ten medals.

Help Bizon the Champion find out if we can put all the rewards so that all the conditions are fulfilled.

Input

The first line contains integers a1a2 and a3 (0?≤?a1,?a2,?a3?≤?100).
The second line contains integers b1b2 and b3 (0?≤?b1,?b2,?b3?≤?100).
The third line contains integer n (1?≤?n?≤?100).

The numbers in the lines are separated by single spaces.

Output

Print "YES" (without the quotes) if all the rewards can be put on the shelves in
the described manner. Otherwise, print "NO" (without the quotes).

Sample test(s)

input

1 1 1
1 1 1
4

output

YES

input

1 1 3
2 3 4
2

output

YES

input

1 0 0
1 0 0
1

output

NO

传送门:点击打开链接

解题思路:

求出放置所有奖杯和奖牌需要的最少架子的数目num,和n进行比较。

代码:

#include <cstdio>
#include <cmath>

int main()
{
    int a1, a2, a3, b1, b2, b3, n;
    scanf("%d%d%d%d%d%d%d", &a1, &a2, &a3, &b1, &b2, &b3, &n);
    int num = ceil((a1 + a2 + a3) * 1.0 / 5) + ceil((b1 + b2 + b3) * 1.0 / 10);
    printf("%s\n", num <= n ? "YES" : "NO");
    return 0;
}

Problem B:

B. Suffix Structures

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Bizon the Champion isn‘t just a bison. He also is a favorite of the "Bizons" team.

At a competition the "Bizons" got the following problem: "You are given two distinct words (strings of English letters), s and t.
You need to transform word s into word t".
The task looked simple to the guys because they know the suffix data structures well. Bizon Senior loves suffix automaton. By applying it once to a string, he can remove from this string any single character. Bizon Middle knows suffix array well. By applying
it once to a string, he can swap any two characters of this string. The guys do not know anything about the suffix tree, but it can help them do much more.

Bizon the Champion wonders whether the "Bizons" can solve the problem. Perhaps, the solution do not require both data structures. Find out whether the guys can solve the problem
and if they can, how do they do it? Can they solve it either only with use of suffix automaton or only with use of suffix array or they need both structures? Note that any structure may be used an unlimited number of times, the structures may be used in any
order.

Input

The first line contains a non-empty word s.
The second line contains a non-empty word t. Words s and t are
different. Each word consists only of lowercase English letters. Each word contains at most 100 letters.

Output

In the single line print the answer to the problem. Print "need tree" (without
the quotes) if word s cannot be transformed into word teven
with use of both suffix array and suffix automaton. Print "automaton" (without the quotes) if you need only the suffix automaton to solve the problem. Print
"array" (without the quotes) if you need only the suffix array to solve the problem. Print "both"
(without the quotes), if you need both data structures to solve the problem.

It‘s guaranteed that if you can solve the problem only with use of suffix array, then it is impossible to solve it only with use of suffix automaton. This is also true for suffix
automaton.

Sample test(s)

input

automaton
tomat

output

automaton

input

array
arary

output

array

input

both
hot

output

both

input

need
tree

output

need tree

传送门:点击打开链接

解题思路:

如果串A中包含串B的所有字母,并且这些字母在串A和串B中排列顺序相同,输出“automaton”,否则,如果串A中包含串B的所有字母,我们在这种情况下在进行讨论,如果A和B的长度相等,输出“array”,如果A比B长,输出“both”,否则输出“need tree”。

代码:

#include <cstring>
#include <string>
#include <iostream>
using namespace std;

const int MAXN = 105;
int vis[MAXN];

bool cmpa(string stra, string strb)
{
    memset(vis, 0, sizeof(vis));
    int lena = stra.length();
    int lenb = strb.length();
    int k = 0;
    for(int i = 0; i < lenb; i++)
    {
        bool flag = true;
        for(int j = k; j < lena; j++)
        {
            if(!vis[j] && strb[i] == stra[j])
            {
                vis[j] = 1;
                k = j + 1;
                flag = false;
                break;
            }
        }
        if(flag) return false;
    }
    return true;
}

bool cmpb(string stra, string strb)
{
    memset(vis, 0, sizeof(vis));
    int lena = stra.length();
    int lenb = strb.length();
    for(int i = 0; i < lenb; i++)
    {
        bool flag = true;
        for(int j = 0; j < lena; j++)
        {
            if(!vis[j] && strb[i] == stra[j])
            {
                vis[j] = 1;
                flag = false;
                break;
            }
        }
        if(flag) return false;
    }
    return true;
}

int main()
{
    string stra, strb;
    cin >> stra >> strb;
    int lena = stra.length();
    int lenb = strb.length();
    if(cmpa(stra, strb))
    {
        cout << "automaton" << endl;
    }
    else if(cmpb(stra, strb))
    {
        if(lena == lenb)
        {
            cout << "array" << endl;
        }
        else if(lena > lenb)
        {
            cout << "both" << endl;
        }
        else
        {
            cout << "need tree" << endl;
        }
    }
    else
    {
        cout << "need tree" << endl;
    }
    return  0;
}

Problem C:

C. Painting Fence

time limit per test

1 second

memory limit per test

512 megabytes

input

standard input

output

standard output

Bizon the Champion isn‘t just attentive, he also is very hardworking.

Bizon the Champion decided to paint his old fence his favorite color, orange. The fence is represented as n vertical
planks, put in a row. Adjacent planks have no gap between them. The planks are numbered from the left to the right starting from one, the i-th
plank has the width of 1 meter and the height of ai meters.

Bizon the Champion bought a brush in the shop, the brush‘s width is 1 meter.
He can make vertical and horizontal strokes with the brush. During a stroke the brush‘s full surface must touch the fence at all the time (see the samples for the better understanding). What minimum number of strokes should Bizon the Champion do to fully paint
the fence? Note that you are allowed to paint the same area of the fence multiple times.

Input

The first line contains integer n (1?≤?n?≤?5000) —
the number of fence planks. The second line contains n space-separated integersa1,?a2,?...,?an (1?≤?ai?≤?109).

Output

Print a single integer — the minimum number of strokes needed to paint the whole fence.

Sample test(s)

input

5
2 2 1 2 1

output

3

input

2
2 2

output

2

input

1
5

output

1

传送门:点击打开链接

解题思路:

递归,贪心。粉刷篱笆,我们可以水平方向粉刷(只能刷到连续的部分),也可以竖直方向粉刷。按水平方向粉刷的话,刷的最少次数是min(a1,a2,a3,...,an-1);按竖直方向刷的话最少次数是这段连续篱笆的长度n。按上述方式刷完之后,必然会产生高度为0的篱笆(被全部刷过了),我们把这样的篱笆作为分割点,分成左半部分,和右半部分,两部分各是一段连续的篱笆,依次类推。

一个错误的思路:每次刷的时候找所有篱笆高度的最大值h,和最长的连续篱笆的长度len,刷的时候取max(h,len),最多刷n次,算法复杂度O(n2)。这样做的话,可能会使得篱笆变得分散,导致最终粉刷的次数变多。

反例:

3

1 10 1

错误的代码:

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

    const int MAXN = 5010;
    int n, ans = 0, a[MAXN];

    int main()
    {
        scanf("%d", &n);
        for(int i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
        }
        while(true)
        {
            int maxv = *max_element(a, a + n);
            int maxh = -1, tmp = 0, first = 1;
            int s = 0, t = 0, ts = 0, tt = 0;
            for(int i = 0; i < n; i++)
            {
                if(a[i])
                {
                    if(first)
                    {
                        ts = i;
                        first = 0;
                    }
                    tt = i;
                    tmp++;
                    if(i == n - 1)
                    {
                        if(tmp > maxh)
                        {
                            maxh = tmp;
                            s = ts;
                            t = tt;
                        }
                    }
                }
                else
                {
                    if(tmp > maxh)
                    {
                        maxh = tmp;
                        s = ts;
                        t = tt;
                    }
                    tmp = 0;
                    first = 1;
                }
            }
            if(maxv > maxh)
            {
                *max_element(a, a + n) = 0;
            }
            else
            {
                for(int i = s; i <= t; i++)
                {
                    a[i]--;
                }
            }
            ans++;
            if(0 == *max_element(a, a + n)) break;
        }
        printf("%d\n", ans);
        return 0;
    }

代码:

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

const int MAXN = 5010;
int n, a[MAXN];

int solve(int l, int r)
{
    if(l > r) return 0;
    int minh = *min_element(a + l, a + r + 1);
    int ret = r - l + 1, tot = minh;
    if(ret < minh)
    {
        for(int i = l; i <= r; i++)
            a[i] = 0;
        return ret;
    }
    else
    {
        for(int i = l; i <= r; i++)
            a[i] -= minh;
        int t = min_element(a + l, a + r + 1) - a;
        tot += solve(l, t - 1) + solve(t + 1, r);
    }
    return min(ret, tot);
}

int main()
{
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    printf("%d\n", solve(0, n - 1));
    return 0;
}

Problem D:

D. Multiplication Table

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Bizon the Champion isn‘t just charming, he also is very smart.

While some of us were learning the multiplication table, Bizon the Champion had fun in his own manner. Bizon the Champion painted ann?×?m multiplication
table, where the element on the intersection of the i-th row and j-th
column equals i·j (the rows and columns of the table are numbered
starting from 1). Then he was asked: what number in the table is the k-th largest number? Bizon the Champion always
answered correctly and immediately. Can you repeat his success?

Consider the given multiplication table. If you write out all n·m numbers
from the table in the non-decreasing order, then the k-th number you write out is called the k-th
largest number.

Input

The single line contains integers nm and k (1?≤?n,?m?≤?5·105; 1?≤?k?≤?n·m).

Output

Print the k-th largest number in a n?×?m multiplication
table.

Sample test(s)

input

2 2 2

output

2

input

2 3 4

output

3

input

1 10 5

output

5

传送门:点击打开链接

解题思路:

二分。需要求的是n*m乘法表中第k大的数,我们可以对这个数ans进行二分查找,区间是[1, n * m],对于每一个可能的ans,我们求出比他小的数的个数sum += min((mid - 1) / i, m);(i = 1,2,3,..,n),记录下小于k的最大的mid,即为我们所求的ans。

代码:

#include <cstdio>

inline long long min(long long a, int b)
{
    if(a < b) return a;
    return b;
}

int main()
{
    int n, m;
    long long k, ans, l, r, sum, mid;
    scanf("%d%d%I64d", &n, &m, &k);
    l = 1, r = 1ll * n * m;//r = (long long)n * m;
    while(l <= r)
    {
        mid = (l + r) >> 1;
        sum = 0;
        for(int i = 1; i <= n; i++)
            sum += min((mid - 1) / i, m);
        if(sum < k)
            l = mid + 1, ans = mid;
        else
            r = mid - 1;
    }
    printf("%I64d\n", ans);
    return 0;
}
时间: 2024-08-29 17:38:48

Codeforces Round #256 (Div. 2) 题解的相关文章

Codeforces Round #262 (Div. 2) 题解

A. Vasya and Socks time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Vasya has n pairs of socks. In the morning of each day Vasya has to put on a pair of socks before he goes to school. When

Codeforces Round #FF (Div. 2) 题解

比赛链接:http://codeforces.com/contest/447 A. DZY Loves Hash time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output DZY has a hash table with p buckets, numbered from 0 to p?-?1. He wants to insert n 

Codeforces Round #259 (Div. 2) 题解

A. Little Pony and Crystal Mine time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Twilight Sparkle once got a crystal from the Crystal Mine. A crystal of size n (n is odd; n?>?1) is an n?×?n 

Codeforces Round #256 (Div. 2)

泛泛解: D:求K大,如果我们二分枚举,如果有O(N)的方法统计,就OK了,先枚举,我们对每一行的统计能够达到O(1),所以很简单了. E:有思路,但是代码能了太弱了,DFS学得太水. 我们发现其实就是一个深度递归结构,只有100000个元素,所以这是一个突破点. 先求出所有因子,然后枚举因子,出现的话深度遍历,结束条件是达到第K层或者因子是1,注意:K大于100000时,要变为100000,因为不可能层数大于100000: C:分治+贪心. 这道真是好题,题解的思路是:对区间(L,R)的点贪心

Codeforces Round #177 (Div. 2) 题解

[前言]咦?现在怎么流行打CF了?于是当一帮大爷在执着的打div 1的时候,我偷偷的在刷div 2.至于怎么决定场次嘛,一般我报一个数字A,随便再拉一个人选一个数字B.然后开始做第A^B场.如果觉得机密性不高,来点取模吧.然后今天做的这场少有的AK了.(其实模拟赛只做完了4题,最后1题来不及打了) 等等,话说前面几题不用写题解了?算了,让我难得风光一下啦. [A] A. Polo the Penguin and Segments time limit per test 2 seconds mem

Codeforces Round #256 (Div. 2)D 二分答案

D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Bizon the Champion isn't just charming, he also is very smart. While some of us were learning the multiplication tabl

Codeforces Round #256 (Div. 2) A/B/C/D

A. Rewards 水题 #include<cstdio> #include<iostream> #include<cstring> using namespace std; int main() { int a1,a2,a3,b1,b2,b3,s,t1,t2,sum1,sum2; while(scanf("%d%d%d",&a1,&a2,&a3)!=EOF) { scanf("%d%d%d",&

Codeforces Round #256 (Div. 2)——Painting Fence

题目连接 题意: n个木条,输入n个木条的高度,每个木条的宽度均为1.现在有长宽均为1的刷子,每次可以选择横着刷或者竖着刷,每次刷的时候不能离开木条,问将所有木条均涂色至少需要刷几次.(刷的时候可以经过已经被刷过的地方) n (1?≤?n?≤?5000),1?≤?ai(高度)?≤?109 分析: 分析一下横着和竖着的关系:假设现在已经有一个操作集合S是答案,那么集合中的操作顺序是可以改变的,即横和竖的顺序可以改变(因为可以经过已经涂色的木条),那么不妨先横着涂色.对于当前[l,r]的区间,答案不

Codeforces Round #256 (Div. 2/B)/Codeforces448B_Suffix Structures(字符串处理)

解题报告 四种情况相应以下四组数据. 给两字符串,推断第一个字符串是怎么变到第二个字符串. automaton 去掉随意字符后成功转换 array 改变随意两字符后成功转换 再者是两个都有和两个都没有 #include <iostream> #include <cstdio> #include <cstring> #include <stdlib.h> #include <algorithm> #include <cmath> usi