欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Codeforces Round #231 (Div. 2)

程序员文章站 2024-02-10 21:14:58
...

Problems # Name A Counting Sticks standard input/output 1 s, 256 MB x2326 B Very Beautiful Number standard input/output 1 s, 256 MB x856 C Dominoes standard input/output 2 s, 256 MB x803 D Physical Education and Buns standard input/output

Problems

Codeforces Round #231 (Div. 2)

# Name
A

Counting Sticks

standard input/output

1 s, 256 MB
Codeforces Round #231 (Div. 2)Codeforces Round #231 (Div. 2) Codeforces Round #231 (Div. 2) x2326
B

Very Beautiful Number

standard input/output

1 s, 256 MB
Codeforces Round #231 (Div. 2)Codeforces Round #231 (Div. 2) Codeforces Round #231 (Div. 2) x856
C

Dominoes

standard input/output

2 s, 256 MB
Codeforces Round #231 (Div. 2)Codeforces Round #231 (Div. 2) Codeforces Round #231 (Div. 2) x803
D

Physical Education and Buns

standard input/output

2 s, 256 MB
Codeforces Round #231 (Div. 2)Codeforces Round #231 (Div. 2) Codeforces Round #231 (Div. 2) x234
E

Lightbulb for Minister

standard input/output

1 s, 256 MB
Codeforces Round #231 (Div. 2)Codeforces Round #231 (Div. 2) Codeforces Round #231 (Div. 2) x49

A题:先处理字符串把3个位置的数字保存下来,在去判断相等或者差值为2,去移动即可。

B题:枚举最后一位数字,模拟往前推数字,推到第一位判断是不是和一开始枚举的数字相同。

C题:贪心,10和01其实是一样的,所以先保存下11,10和01的总数,00的个数,先从左往右放11,放完之后,在从右边往左边去放10,01,每行交替着放即可,剩下的就是00。

D题:从小到大排序后,先枚举公差d,先变化后的序列A1是0,然后求出整个需要去向上移动的最大值和最小值(可能是负的),那么变化后的序列其实可以看成一条斜率k是d,b是A1的直线,然后这条直线无论上移下移,那么对于最大值和最小值肯定还是原来那2个位置,那么只要保证移动到最大值和最小值中的最大值尽可能小,那么就是去中间肯定是最优的,为(up + down + 1)/2 (要向上取整所以+1),最后维护ans的最小值即可。

D题:还有一种解法,二分答案,然后去判断,判断的方式先枚举公差,在用O(n)的方法去维护每个上下区间从大到小。

代码:

A题:

#include 
#include 

char c;

int main() {
    int num[3], s = 0; 
    memset(num, 0, sizeof(num));
    while ((c = getchar()) != EOF && c != '\n') {
        if (c == '+' || c == '=') s++;
        else num[s]++;
    }
    if (num[0] - 1 + num[1] == num[2] + 1) {
        if (num[0] == 1) num[1]--;
        else if (num[1] == 1) num[0]--;
        else if (num[0] != 1 && num[1] != 1) num[0]--;
        num[2]++;
    }
    else if (num[0] + num[1] == num[2]) {
    
    }
    else if (num[0] + 1 + num[1] == num[2] - 1) {
        if (num[2] == 1) {
            printf("Impossible\n");
            return 0;
        }
        num[2]--;
        num[0]++;
    }
    else {
        printf("Impossible\n");
        return 0;
    }
    int i;
    for (i = 0; i 
B题:
#include 
#include 

int p, x, ans[1000005];

int main() {
    scanf("%d%d", &p, &x);
    int yu = 0;
    for (int i = 0; i = 0; j--)
                printf("%d", ans[j]);
            printf("\n");
            return 0;
        }
    }
    printf("Impossible\n");
    return 0;
}

C题:

#include 
#include 

int n, m, i, j;
int num10, num00, num11;
char str[10], ans[1005][1005][4];

int main() {
    num10 = num00 = num11 = 0;
    scanf("%d%d", &n, &m);
    for (i = 0; i 
D题1:
#include 
#include 
#include 
#define INF 0x3f3f3f3f
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a) res) {
            ans = res; start = -up + res; dd = d;
        }
    }
    printf("%d\n%d %d\n", ans, start, dd);
}

int main() {
    scanf("%d", &n);
    for (int i = 0; i 
D题2:
#include 
#include 
#include 
#define INF 0x3f3f3f3f
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)= 0; i--) {
			up = min(num[i] + Max, up - d);
			down = max(num[i] - Max, down - d);
		}
		if (down