[ACM]Codeforces Round #534 (Div. 2)

一、前言
二、题面

A. Splitting into digits

Vasya has his favourite number n. He wants to split it to some non-zero digits. It means, that he wants to choose some digits d1,d2,…,dk, such that 1≤di≤9 for all i and d1+d2+…+dk=n.

Vasya likes beauty in everything, so he wants to find any solution with the minimal possible number of different digits among d1,d2,…,dk. Help him!

Input
The first line contains a single integer n — the number that Vasya wants to split (1≤n≤1000).

Output
In the first line print one integer k — the number of digits in the partition. Note that k must satisfy the inequality 1≤k≤n. In the next line print k digits d1,d2,…,dk separated by spaces. All digits must satisfy the inequalities 1≤di≤9.

You should find a partition of n in which the number of different digits among d1,d2,…,dk will be minimal possible among all partitions of n into non-zero digits. Among such partitions, it is allowed to find any. It is guaranteed that there exists at least one partition of the number n into digits.

Examples
input
1
output
1
1

input
4
output
2
2 2

input
27
output
3
9 9 9

Note
In the first test, the number 1 can be divided into 1 digit equal to 1.

In the second test, there are 3 partitions of the number 4 into digits in which the number of different digits is 1. This partitions are [1,1,1,1], [2,2] and [4]. Any of these partitions can be found. And, for example, dividing the number 4 to the digits [1,1,2] isn't an answer, because it has 2 different digits, that isn't the minimum possible number.

题意:尝试用k个数字(0~9)加起来变成n,要求数字种类尽可能少,即能全部用相同的数字时就不用不同的数字。

正解:cf日常无聊题。第一行输出n,第二行输出n个1即可。

代码:略

 

B. Game with string

Two people are playing a game with a string s, consisting of lowercase latin letters.

On a player's turn, he should choose two consecutive equal letters in the string and delete them.

For example, if the string is equal to "xaax" than there is only one possible turn: delete "aa", so the string will become "xx". A player not able to make a turn loses.

Your task is to determine which player will win if both play optimally.

Input
The only line contains the string s, consisting of lowercase latin letters (1≤|s|≤100000), where |s| means the length of a string s.

Output
If the first player wins, print "Yes". If the second player wins, print "No".

Examples
input
abacaba

output
No

input
iiq

output
Yes

input
abba

output
No

Note
In the first example the first player is unable to make a turn, so he loses.

In the second example first player turns the string into "q", then second player is unable to move, so he loses.

题意:每次从给出的字符串删去两个相连且相同的字符,删去个数为奇数时输出Yes,偶数输出No。

思路:扫描字符串,找到相连的相同字符后,左端点向左,右端点向右进行搜索,直至左右端点不是相同字符,结束,继续扫描,直至字符串末尾。注意,删除子串后应将删除部分的左端和右端相连,以保证后面的扫描的正确性。解决这个问题,我们可以先对字符串进行链标记,对字符进行串联,即对每一个字符标记一个左字符和右字符,初始即其左右的临近字符,在每次操作后可将该标记进行调整。

代码:

 1 #include <bits/stdc++.h>
 2 #define MAXN 100005
 3 
 4 char ch[MAXN];
 5 int len, tot;
 6 
 7 struct node {
 8     char s;
 9     int l, r;
10 } a[MAXN];
11 .
12 int chk(int o) {
13     int l = o, r = o + 1; tot++;
14     while (a[a[l].l].s == a[a[r].r].s && a[a[l].l].s != '\000') 
15         l = a[l].l, r = a[r].r, tot++;
16     a[a[r].r].l = a[l].l;
17     return a[r].r;
18 }
19 
20 int main() {
21     scanf("%s", ch + 1), len = strlen(ch + 1);
22     for (int i = 1; i <= len; i++) a[i].s = ch[i], a[i].l = i - 1, a[i].r = i + 1;
23     for (int i = 1; i <= len; i = (a[i].s == a[i + 1].s && a[i].s != '\000') ? chk(i) : i + 1);
24     printf(tot % 2 ? "Yes" : "No");
25     return 0;
26 }

猜你喜欢

转载自www.cnblogs.com/jinkun113/p/10312058.html