菜鸡日常刷CF # 452DIV2 前三题

来源:互联网 发布:淘宝怎么成为大v 编辑:程序博客网 时间:2024/06/16 13:32

其实都挺简单的……打算尝试做一下后面三题,先把前三题的题解写了好啦


A
其实就是统计1和2的个数 做简单判断即可,连我这种菜鸡都没什么问题
用C++写的(学校里在学,所以我一般写题是用C++)

#include <iostream>using namespace std;int main(void) {    ios::sync_with_stdio(false);    int n;    cin >> n;    int ones, twos, tmp;    ones = twos = 0;    while (n--) {        cin >> tmp;        if (tmp == 1)            ones++;        else if (tmp == 2)            twos++;    }    int teams = twos >= ones ? ones : twos;    if (ones > twos) {        teams += (ones - twos) / 3;    }    cout << teams << endl;    return 0;}



B
数年月,比我之前做过的一道输出某年某月的日历简单多了…
像我一样做简单判断可以,也看到很多人直接写了四年的,这样就包括了所有可能性,我觉得也很好,特别python的in来判断是否在那里面特别简单(用字符串的话 你懂我意思吧)
依然是用C++写的 (感觉我每次写个C++程序又臭又长

#include <iostream>using namespace std;#define MAX 24int main(void) {    ios::sync_with_stdio(false);    int months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };    int a[MAX];    int n, i, j, tmp, k;    cin >> n;    for (i = 0; i < n; i++) {        cin >> tmp;        if (tmp > 31 || tmp < 28) {            cout << "NO" << endl;            return 0;        }        a[i] = tmp;    }    // see if it's ok    i = j = 0;    bool flag;    tmp = a[0];    for (j = 0; j < 12; j++) {        if (tmp == months[j] || (tmp == 29 && j == 1)) {            k = j;            flag = 0;            for (i = 0; i < n; i++, k++) {                if (k > 11) {                    k %= 12;                }                if (a[i] != months[k]) {                    if (k == 1 && a[i] == 29 && !flag) {                        flag = 1;                    }                    else {                        break;                    }                }            }            if (i == n) {                cout << "YES" << endl;                return 0;            }        }    }    cout << "NO" << endl;    return 0;}



C
其实很好奇这道题究竟应该怎么做,但tutorial还没出来
所以今天下午和同学一起又想了会 就做出来了
其实分析一下,我们可以知道 对于两组的difference,其实只会有两种情况,就是0和1,那么一个简单判断就可以完成。比较麻烦的是输出分组,今天下午突然想到了一种玄学方法…都不知道怎么在理论上证明此法可行…具体就是先把需要的那一半给算出来,我是都算小的那半,然后把从1到n的前一半给提出来,放列表里(或者C里面的数组里 就这个意思嘛),列表元素的和如果小于需要的值,那么就把还没加如列表后面那个给吃进去;如果大于的话,就把列表中第一个元素给吐出来…具体的可以想想一个框在1 2 … n 这些数上移动,右边吞,左边吐。
python写的(因为这学期的C考完了…暂时不用担心…所以就又优先用我喜欢的语言了)
(今天用markdown一点也不顺,一按回车键就疯狂跳…还会在代码里给我加奇怪的东西 哼)
(不想加标签了,写这个就自己玩玩)

n = int(input())num_list = []part_sum = (n * (n + 1)) // 4# find out the "difference"if n % 4 == 1 or n % 4 == 2:    dif = 1elif n % 4 == 3 or n % 4 == 0:    dif = 0# find out the num_listnow = 0for i in range(n // 2):    num_list.append(i + 1)    now += i + 1i += 1while now != part_sum:    if now < part_sum:        i += 1        num_list.append(i)        now += i    else :        now -= num_list.pop(0)# print the resultprint(dif)print(len(num_list), end=" ")for i in range(len(num_list)):    print(num_list[i], end=" ")
原创粉丝点击