专栏首页Code思维奇妙屋Codeforces Round #359 div2

Codeforces Round #359 div2

Problem_A(CodeForces 686A): 题意: \[ 有n个输入, +\space d_i代表冰淇淋数目增加d_i个, -\space d_i表示某个孩纸需要d_i个, 如果你现在手里没有\space d_i个冰淇淋, 那么这个孩纸就会失望的离开。\] 你初始有x个冰淇淋。 问最后有多少个孩纸失望的离开了。

思路: 模拟就好了, 判断当前的数目是否足够。

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define eps 1e-6
#define MAXN 1000000
#define MAXM 100
#define dd {cout<<"debug"<<endl;}
#define pa {system("pause");}
#define p(x) {printf("%d\n", x);}
#define pd(x) {printf("%.7lf\n", x);}
#define k(x) {printf("Case %d: ", ++x);}
#define s(x) {scanf("%d", &x);}
#define sd(x) {scanf("%lf", &x);}
#define mes(x, d) {memset(x, d, sizeof(x));}
#define do(i, x) for(i = 0; i < x; i ++)
#define dod(i, x, l) for(i = x; i >= l; i --)
#define doe(i, x) for(i = 1; i <= x; i ++)
int n;
LL x;

int main()
{
    LL res, child_num;
    scanf("%d %I64d", &n, &x);
    res = x;
    child_num = 0;
    LL total_num = 0;
    LL d;
    char op[2];
    for(int i = 0; i < n ;i ++)
    {
        scanf("%s %I64d", op, &d);
        if(op[0] == '+')
            res += d;
        else if(op[0] == '-')
        {
            total_num ++;
            if(d <= res)
            {
                res -= d;
                child_num ++;
            }
        }
    }
    printf("%I64d %I64d\n", res, total_num - child_num);
    return 0;
}

Problem_B(CodeForces 686B): 题意: 你能做如下操作: [l, r]保证长度为偶数。 \[ 将(l, l+1), \cdots ,(r-1, r)交换。\] 你最后的目的是将其交换成一个非递减的数列。 请将交换过程中的l, r输出。

思路: n<100, 可以很暴力的去冒泡, 因为最差的情况也不会超过100*100次。 而题目给的是2W次以内。 昂, 我比较傻逼的写了一个贪心。 每次去找最长的能够交换的区间, 然后进行操作, 一直到不能操作为止。

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define eps 1e-6
#define MAXN 110
#define MAXM 100
#define dd {cout<<"debug"<<endl;}
#define pa {system("pause");}
#define p(x) {printf("%d\n", x);}
#define pd(x) {printf("%.7lf\n", x);}
#define k(x) {printf("Case %d: ", ++x);}
#define s(x) {scanf("%d", &x);}
#define sd(x) {scanf("%lf", &x);}
#define mes(x, d) {memset(x, d, sizeof(x));}
#define do(i, x) for(i = 0; i < x; i ++)
#define dod(i, x, l) for(i = x; i >= l; i --)
#define doe(i, x) for(i = 1; i <= x; i ++)
int n;
int a[MAXN];

int find_(int l, int r, bool is_l)
{
    if(l > r) return l - 1;
    for(int i = l; i + 1 <= r; i +=2)
        if((a[i] <= a[i + 1] && is_l == false) || (a[i] > a[i + 1] && is_l == true)) return is_l ? i : i - 1;
    return is_l ? -1 : ((r - l + 1) % 2 == 0 ? r : r - 1); 
}

void move_(int l, int r)
{
    for(int i = l; i < r; i += 2)
    {
        int temp = a[i];
        a[i] = a[i + 1];
        a[i + 1] = temp;
    }
}
void show()
{
    for(int i = 1; i <= n; i ++)
        printf("%d ", a[i]);
    printf("\n");
}

void deal()
{
    int l = 1, r;
    while(true)
    {
        l = find_(1, n, true);
        if(l == -1)
        {
            l = find_(2, n, true);
            if(l == -1) return ;
        }
        r = find_(l + 2, n, false);
        if(r == -1) return;

        // printf("==>%d %d\n", l, r);
        move_(l, r);
        // show();
        // pa

        printf("%d %d\n", l, r);
    }
}   

int main()
{
    bool flag = true;
    a[0] = 0;
    scanf("%d", &n);
    flag = n == 1;
    for(int i = 1; i <= n; i ++)
    {
        scanf("%d", &a[i]);
        if(a[i] > a[i - 1] && n && i > 1) flag = false;
    }

    if(!flag)
        deal();
    return 0;
}

Problem_C(CodeForces 686C): 题意: 给你n, m,将其转换成对应的7进制 然后从转换后的[0, n-1]中任选一个数, 再从转换后[0,m-1]中任选一个数。 必须要保证每个数字只出现一次, 即不会有重复的数字。 问你这样的组合有多少种。

思路: 因为是7进制, 而且要保证每位都不一样, 7进制只有7个数而已, 所以如果两个数的长度超过了7, 肯定不行。 \[ 再则, 要注意:转换成对应的7进制! 比如8, 转换成7进制, 是11, 那么这8个数就成了[00, 01, 02, \cdots , 10].而不是[0, 1, 2, 3, \cdots , 10]\] \[ 所以可以先求出它们的长度len_n, len_m, 然后判断长度。\] 枚举0~n, 0~m。 将其分解成对应的7进制后判断是否出现相同数字即可。

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define eps 1e-6
#define MAXN 1000000
#define MAXM 10
#define dd {cout<<"debug"<<endl;}
#define pa {system("pause");}
#define p(x) {printf("%d\n", x);}
#define pd(x) {printf("%.7lf\n", x);}
#define k(x) {printf("Case %d: ", ++x);}
#define s(x) {scanf("%d", &x);}
#define sd(x) {scanf("%lf", &x);}
#define mes(x, d) {memset(x, d, sizeof(x));}
#define do(i, x) for(i = 0; i < x; i ++)
#define dod(i, x, l) for(i = x; i >= l; i --)
#define doe(i, x) for(i = 1; i <= x; i ++)
int n, m;
int left_len = 0, right_len = 0;

int check(int x, int y)
{
    int used[MAXM] = {0};
    for(int i = x, k = 0; k < left_len; k ++, i /= 7)
        used[i % 7] += 1;
    for(int i = y, k = 0; k < right_len; k ++, i /= 7)
        used[i % 7] += 1;

    for(int i = 0; i < 7; i ++)
        if(used[i] > 1) return 0;
    return 1;
}

int main()
{
    scanf("%d %d", &n, &m);


    left_len = right_len = 1;
    for(int i = 7; i < n; i *= 7)
        left_len ++;
    for(int i = 7; i < m; i *= 7)
        right_len ++;

    int ans = 0;
    if((left_len + right_len) <= 7)
    {
        for(int i = 0; i < n; i ++)
            for(int j = 0; j < m; j ++)
                ans += check(i, j);
    }
    printf("%d\n", ans);
    return 0;
}

Orz 有点头痛,剩下的等明天再补。今天元气大伤

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Codeforces Round #360 div2

      有d天, n个人。如果这n个人同时出现, 那么你就赢不了他们所有的人, 除此之外, 你可以赢他们所有到场的人。

    若羽
  • Codeforces Round #326 div2

      Duff 很喜欢吃肉, 每天都要吃,然而她又懒得下楼。 可以买很多放在家里慢慢吃。然而肉价每天都在变化,现给定一个n, 表示有多少天,然后第i天吃ai kg...

    若羽
  • LightOj_1317 Throwing Balls into the Baskets

      每个人进球数的期望为:E = sigma (i * C(K, i) * p ^ i * (1 - p) ^ (k - i));

    若羽
  • Codeforces Round #360 div2

      有d天, n个人。如果这n个人同时出现, 那么你就赢不了他们所有的人, 除此之外, 你可以赢他们所有到场的人。

    若羽
  • Codeforces Round #326 div2

      Duff 很喜欢吃肉, 每天都要吃,然而她又懒得下楼。 可以买很多放在家里慢慢吃。然而肉价每天都在变化,现给定一个n, 表示有多少天,然后第i天吃ai kg...

    若羽
  • Codeforces Round #315 (Div. 2)

    这次可以说是最糟糕的一次比赛了吧, 心没有静下来好好的去思考, 导致没有做好能做的题。

    若羽
  • 四则运算、幸福来敲门、求一次方程解ax+b=0

    /* 功能:四则运算 日期:2013-03-16 */ #include<stdio.h> #include<stdlib.h>

    汐楓
  • cf540D. Bad Luck Island(概率dp)

    还是想复杂了啊,我列的状态时$f[i][j], g[i][j],t[i][j]$分别表示第$i$天,$j$个$s, r, p$活着的概率

    attack
  • Python的内置函数(四十八)、setattr()函数

    setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的。

    于小勇
  • 数据哪里找?奉上社会发展类公开数据清单:6千万条数据

    公开数据能帮助记者找到好故事、验证信息。来自34个国家的24万数据如何一搜可得?有哪些关于社会发展议题的权威门户可以将数据一网打尽?遇到海量数据,想批量转换格式...

    华章科技

扫码关注云+社区

领取腾讯云代金券