Codeforces Round #554 (Div. 2)自闭记

A

签到

#include<bits/stdc++.h>
using namespace std;
int n,m,s[2],t[2],ans;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1,x;i<=n;i++)scanf("%d",&x),s[x&1]++;
    for(int i=1,x;i<=m;i++)scanf("%d",&x),t[x&1]++;
    ans=min(s[0],t[1])+min(s[1],t[0]);
    printf("%d",ans);
}
View Code

B

要求40次,而log(1e6)≈20,也就是说最多20个二进制位,可以每次翻转最高的“0”位,然后再+1即可。证明:若为11...10...00,则翻转最高0位后直接结束;若为全1,也是直接结束;若后面存在1,翻转后必然存在0,使得最高位向后走。

#include<bits/stdc++.h>
using namespace std;
int n,m,tim,a[1000];
bool judge(int x)
{
    int flag=1;
    for(int i=30;i>=0;i--)
    if(x&(1<<i))flag=0;
    else if(!flag)return 0;
    return 1;
}
int main()
{
    cin>>n;
    while(!judge(n))
    {
        tim++;
        if(tim&1)
        {
            int flag=1;
            for(int i=30;i>=0;i--)if(n&(1<<i))flag=0;else if(!flag){a[++m]=i+1;break;}
            n^=(1<<a[m]+1)-1;
        }
        else n++;
    }
    printf("%d\n",tim);
    for(int i=1;i<=m;i++)printf("%d ",a[i]);
}
View Code

C

签到,开始还看成了最大公约数,自闭。其实就是枚举差值的每个因数,暴力加一下即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,d,ans,mn;
void work(ll x)
{
    ll t=(x-a%x)%x,A=a+t,B=b+t,g=A/__gcd(A,B)*B;
    if(g<mn)mn=g,ans=t;
    else if(g==mn&&t<ans)ans=t;
}
int main()
{
    cin>>a>>b;
    if(a==b){cout<<0;return 0;}
    if(a>b)d=a-b;else d=b-a;
    mn=a/__gcd(a,b)*b;
    for(ll i=1;i*i<=d;i++)
    if(d%i==0)work(i),work(d/i);
    cout<<ans;
}
View Code

D

被这题搞自闭了,看到什么最大值对1e9+7取模以为是个神仙题,后来才发现是个SB贪心题,其实就是能选的边尽量选,后来证明了一下:只有一个儿子显然,有两个儿子可以证明:如果自己能选没选,那么两个儿子的边也只能选1个,还会影响后面,如果自己不能选,随机选一个是也是对的。然后可以f[i][j][0/1]表示走了i步,前缀和为j,该点与父亲的边是否被选的节点数有几个,直接暴力转移即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1007,mod=1e9+7;
int n,ans,f[2*N][N][2];
void add(int&x,int y){x=(x+y)%mod;}
int main()
{
    scanf("%d",&n);
    f[1][1][1]=1;
    for(int i=1;i<=2*n;i++)
    for(int j=0;j<=n;j++)
    {
        int lc=n+1,rc=n+1;
        if(j+1<=2*n-i-1)lc=j+1;
        if(j)rc=j-1;
        if(lc>n&&rc>n)continue;
        if(f[i][j][0])
        {
            if(lc<=n&&rc<=n)add(f[i+1][lc][1],f[i][j][0]),add(f[i+1][rc][0],f[i][j][0]);
            else if(lc<=n)add(f[i+1][lc][1],f[i][j][0]);
            else add(f[i+1][rc][1],f[i][j][0]);
        }
        if(f[i][j][1])
        {
            if(lc<=n)add(f[i+1][lc][0],f[i][j][1]);
            if(rc<=n)add(f[i+1][rc][0],f[i][j][1]);
        }
    }
    for(int i=1;i<=2*n;i++)
    for(int j=0;j<=n;j++)
    if(f[i][j][1])add(ans,f[i][j][1]);
    printf("%d",ans);
}
View Code

E

自闭不会,咕。

F

神仙题,弃疗,咕,争取订正出F1吧。

新号打的,初始语言默认C差评,被卡了十几分钟CE不知道,十分不爽。

result:rank95 rating+=225 now_rating=1725

猜你喜欢

转载自www.cnblogs.com/hfctf0210/p/10766200.html