Codeforces Round #582 (Div. 3) codeforces 1213

题目链接

ABCD1水题。

哎,两个小时就除了这四个题,出题太慢了......

D2:

题意:给你n个数,每次可以选任意一个数,让它除以等于2(向下取整),可以操作任意多次,问最少操作多少次能使这n个数中有k个相等的数。

思路:用vector存一下就行了。做题的时候光想dp了,实际上不是dp,就是个思维题。

#include
#define mem(a,b) memset((a),b,sizeof(a))
#define de cout< v[maxn];
int main()
{

    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    if(k==1)
        {printf("0\n");return 0;}
    for(int i=1;i<=n;i++)
    {
        int p=a[i],cnt=0;
        while(p>=0)
        {
            v[p].push_back(cnt);
            if(p==0)
                break;
            p/=2;
            cnt++;
        }
    }
    int ans=inf,anss;
    for(int i=0;i=k)
        {
            sort(v[i].begin(),v[i].end());
            anss=0;
            for(int j=0;j

E:

题意:给你一个整数n,再给你两个长度均为2的字符串(均有abc三个字符构成),问:能否找到一个长度为3n的字符串满足abc三个字符的数目均为n,并且上面两个字符串都不是这个字符串的子串,输出这个字符串,如果不存在这样的字符串输出NO。

思路:实际上这题答案一定存在,做的时候我也猜到了,就是不知道答案那个字符串是啥。

就是这个答案可以由简单的字符变换出来,比如:abc可以变换成aabbcc,aaabbbccc,或者abcabc,abcabcabc,就这两个情况,对abc搞个全排列,然后把这两种变换都是一下,一定能找到结果。

具体=可以看这篇博客:https://www.cnblogs.com/wawcac-blog/p/11464774.html

#include
#define mem(a,b) memset((a),b,sizeof(a))
#define de cout<

G:

题意:一个有向图,每条边都有一个权值,有m个询问,每个询问找出有多少对点使得这些点对之间的最大边权不大于q。

思路:

把询问离线,对于每个询问,我们把比他的要求小的边全部加进树中。

那么答案就是所有连通块的贡献,每个连通块的贡献是sz*(sz-1)/2

那么我们按询问的要求值从小到大排序,然后每次尝试加边,并用并查集维护连通块大小

参考博客:https://blog.csdn.net/liufengwei1/article/details/100168298

#include
#define mem(a,b) memset((a),b,sizeof(a))
#define de cout<

 

你可能感兴趣的:(CF,HDU,POJ,题目)