Codeforces Round #393 div2

A. Petr and a calendar模拟)

http://codeforces.com/problemset/problem/760/A

题意:已知2017年m月1日是星期d,求这个月日历有多少行。

算法:简单模拟或者直接用公式算

代码:

#include<bits/stdc++.h>
using namespace std;
int month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{
    int m, d;
    scanf("%d %d", &m, &d);
    int column = 1;
    for (int i = 1; i <= month[m-1]; i++)
        if ((d == 7) && (i < month[m-1]))
        {
            d = 1;
            column++;
        }
        else
            d++;
    printf("%d", column);
    return 0;
}

B. Frodo and pillows(二分答案+贪心)

http://codeforces.com/problemset/problem/760/B

题意:已知n个正整数的和为m,要求相邻两数差不超过1,求第k个数的最大值。

算法:我们在区间上二分答案,相应的check(x)函数返回第k个数为x时的最小总数是否超过m。若第k个数为x,则第k±1个数为x-1,第k±2个数为x-2,以此类推,直到变为1或者达到首尾。根据等差数列求和公式,易知当第k个数的一边有y个数时,这y个数的和

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n, m, k;
LL sum(LL x, LL y)
{
    if (y > x-1)
        return (x-1)*x/2 + y-(x-1);
    else
        return (x-1+x-y)*y/2;
}
bool check(LL x)
{
    if (sum(x, k-1)+x+sum(x, n-k) <= m)
        return 1;
    else
        return 0;
}
int main()
{
    scanf("%d %d %d", &n, &m, &k);
    LL low = 1;
    LL hgh = m+1;
    while (low < hgh-1)
    {
        LL mid = (low+hgh)>>1;
        if (check(mid))
            low = mid;
        else
            hgh = mid;
    }
    printf("%d", low);
    return 0;
}

C.  Pavel and barbecue(DFS)

http://codeforces.com/problemset/problem/760/C

题意:已知排列p和数列,每个时刻将i位置烤串移动到位置,并且若则将烤串翻转一次。求对p和b最少一共修改多少次,可以使每个烤串在每个位置被烤两面后能回到原位置。

算法:

1.若每个烤串遍历每个位置后回到原位置,则整个遍历过程形成一个环。当遍历出若干个环时,我们只需要DFS统计环的个数即可(每个环修改一条边与相邻的环相连最后必能形成一个大环)。

2.每个烤串一共被翻转次最后朝向是。易知若为奇数则不要修改b;若为偶数则只需要再修改一次(将任意一个改为1即可)。

代码:

#include<bits/stdc++.h>
using namespace std;
#define MAXN 300000
#define FOR(i, N) for (int i=1; i<=N; i++)
int n;
int p[MAXN];
bool vis[MAXN];
void DFS(int x)
{
    if (!vis[p[x]])
    {
        vis[p[x]] = 1;
        DFS(p[x]);
    }
}
int main()
{
    int bi, res = 0, sum = 0;
    scanf("%d", &n);
    FOR(i, n) scanf("%d", &p[i]);
    FOR(i, n)
    {
        scanf("%d", &bi);
        sum += bi;
    }
    if (sum%2 == 0) res = 1;
    int cnt = 0;
    memset(vis, 0, sizeof(vis));
    FOR(i, n)
        if (!vis[i])
        {
            vis[i] = 1;
            DFS(i);
            cnt++;
        }
    if (cnt == 1)
        printf("%d", res);
    else
        printf("%d", res+cnt);
    return 0;
}
时间: 2024-08-08 05:21:25

Codeforces Round #393 div2的相关文章

codeforces round #257 div2 C、D

本来应该认真做这场的,思路都是正确的. C题,是先该横切完或竖切完,无法满足刀数要求,再考虑横切+竖切(竖切+横切), 因为横切+竖切(或竖切+横切)会对切割的东西产生交叉份数,从而最小的部分不会尽可能的大. 代码如下,虽然比较长.比较乱,但完全可以压缩到几行,因为几乎是4小块重复的代码,自己也懒得压缩 注意一点,比如要判断最小块的时候,比如9行要分成2份,最小的剩下那份不是9取模2,而应该是4 m/(k+1)<=m-m/(k+1)*k          #include<bits/stdc+

codeforces Round #250 (div2)

a题,就不说了吧 b题,直接从大到小排序1-limit的所有数的lowbit,再从大到小贪心组成sum就行了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #define N 200000 6 using namespace std; 7 int pos[N],a[N],s[N],f[N],la[N],b[N],i,j,k,ans,n,p

Codeforces Round#320 Div2 解题报告

Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Finding Team Member codeforces 579C A Problem about Polyline codeforces 579D "Or" Game codeforces 579E Weakness and Poorness codeforces 579F LCS Aga

Codeforces Round #254(div2)A

很有趣的题.想到了就非常简单,想不到就麻烦了. 其实就是一种逆向思维:最后结果肯定是这样子: WBWBWBWB... BWBWBWBW... WBWBWBWB... ... 里面有“-”的地方改成“-”就行了. 但是我开始是正着想的,想每个点怎么处理,这还要看它周围点的状态,越想越麻烦... 这题中体现的正难则反的逆向思维很值得学习. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs

Codeforces Round #254(div2)B

就是看无向图有几个连通块,答案就是2n-num. 范围很小,就用矩阵来存图减少代码量. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #inc

Codeforces Round #260(div2)C(递推)

有明显的递推关系: f[i]表示i为数列中最大值时所求结果.num[i]表示数i在数列中出现了几次. 对于数i,要么删i,要么删i-1,只有这两种情况,且子问题还是一样的思路.那么很显然递推一下就行了:f[i]=max(f[i-1],f[i-2]+i*num[i]); 这里技巧在于:为了防止麻烦,干脆就所有数的出现次数都记录一下,然后直接从2推到100000(类似于下标排序),就不用排序了,也不用模拟删除操作了.这一技巧貌似简单,但实际上临场想出来也需要点水平. #include<iostrea

Codeforces Round #289 Div2 E

Problem 给一串长度为N的字符串,对于每个字符,若字符为元音,则权值为1,否则为0.一个子串的权值定义为该串所有字符权值之和除以字符个数,一个母串的权值定义为所有子串的权值之和.求母串的权值. Limits Time Limit(ms): 1000 Memory Limit(MB): 256 N: [1, 5*10^5] 字符集: 'A'-'Z' 元音: I E A O U Y Solution 考虑每个元音字符对母串的贡献,可以找出规律. More 举"ABCDOEFGHKMN"

Codeforces Round #403 div2 C. Andryusha and Colored Balloons

题目链接:Codeforces Round #403 div2 C. Andryusha and Colored Balloons 题意: 给你一棵n个节点的树,然后让你染色,规定相连的三个 节点不能同色,问需要的最少颜色,并输出其中一种方案. 题解: 因为只有相邻3个节点不同色. 所以直接DFS,每个节点都从1开始. 然后ans[v]!=ans[u]!=ans[fa]就行. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i&

CodeForces Round#229 DIV2 C 递推DP

对这道题目也只好说呵呵了,没注意k的范围最大才10,所以昨晚纠结了很久,没什么好的方法来处理,后来无奈想去翻翻题解,发现人家开头就来了句,因为k的范围比较小 所以.........我只好暂停马上回头看看题目,是的,k比较小所以完全可以先在询问前预处理DP一遍, DP就比较清晰了,dp[i][j]  (i>=0 && i<k,,,,j>=i && j <=n)代表意义呢 以i为开头的  区间[1,j]注意 是 1~j的 所需要的操作数,题目问的是最小操