1. 程式人生 > >Avito Code Challenge 2018 A~E

Avito Code Challenge 2018 A~E

ID 情況 elves In shel int 長度 %d -o

A. Antipalindrome

還以為是什麽神dp結果就是分情況討論啊
原串是一串一樣的字符的話輸出0,是回文串的話輸出n-1,否則直接輸出原串長度

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=55;
int n;
char s[N];
int main()
{
    scanf("%s",s+1);
    n=strlen(s+1);
    int f=1;
    for(int i=1;i<n;i++)
        if
(s[i]!=s[i+1]) { f=0; break; } if(f) { puts("0"); return 0; } f=1; for(int i=1;i<=n/2;i++) if(s[i]!=s[n-i+1]) { f=0; break; } printf("%d\n",n-f); return 0; }

B. Businessmen Problems

hash一下,然後對每個化學元素取收入最大值即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int N=200005;
int n,m,a[N],b[N],c[N],d[N],g[N],tot,has,ans[N];
long long sum;
map<int,int>mp;
int read()
{
    int r=0,f=1;
    char p=getchar();
    while
(p>‘9‘||p<‘0‘) { if(p==‘-‘) f=-1; p=getchar(); } while(p>=‘0‘&&p<=‘9‘) { r=r*10+p-48; p=getchar(); } return r*f; } int main() { n=read(); for(int i=1;i<=n;i++) a[i]=read(),c[i]=read(),g[++tot]=a[i]; m=read(); for(int i=1;i<=m;i++) b[i]=read(),d[i]=read(),g[++tot]=b[i]; sort(g+1,g+1+tot); for(int i=1;i<=tot;i++) if(i==1||g[i]!=g[i-1]) mp[g[i]]=++has; for(int i=1;i<=n;i++) ans[mp[a[i]]]=c[i]; for(int i=1;i<=m;i++) ans[mp[b[i]]]=max(ans[mp[b[i]]],d[i]); for(int i=1;i<=has;i++) sum+=1ll*ans[i]; printf("%lld\n",sum); return 0; }

C. Useful Decomposition

有三種可能情況:所有鏈在某一點上相交,也就是只有一個點度數>2;只有一條鏈,就是兩個點度數為1,其他點度數為2;不符合要求的情況,就是有超過一個點度數>2

#include<iostream>
#include<cstdio>
using namespace std;
const int N=200005;
int n,d[N],sum,con,p,ans[N],tot;
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p>‘9‘||p<‘0‘)
    {
        if(p==‘-‘)
            f=-1;
        p=getchar();
    }
    while(p>=‘0‘&&p<=‘9‘)
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
int main()
{
    n=read();
    for(int i=1;i<n;i++)
    {
        int x=read(),y=read();
        d[x]++,d[y]++;
    }
    for(int i=1;i<=n;i++)
    {
        if(d[i]>2)
            p=i,sum++;
        if(d[i]==1)
            ans[++tot]=i,con++;
    }
    if(sum>1)
    {
        puts("No");
        return 0;
    }
    if(sum==0)
    {
        printf("Yes\n1\n%d %d\n",ans[1],ans[2]);
        return 0;
    }
    printf("Yes\n%d\n",con);
    for(int i=1;i<=n;i++)
        if(d[i]==1)
            printf("%d %d\n",p,i);
    return 0;
}

D. Bookshelves

很好的dp
或許應該叫按位貪心?從高位到低位枚舉,然後f[i][j]表示到j為止分為i段能否讓當前枚舉的位為1,轉移的時候也要註意滿足之前枚舉的位能不變為0

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=55;
int n,k;
long long a[N],ans;
bool f[N][N];
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
        scanf("%lld",&a[i]);
    for(int i=60;i>=0;i--)
    {
        memset(f,0,sizeof(f));
        f[0][0]=1;
        for(int j=0;j<k;j++)
            for(int l=0;l<n;l++)
                if(f[j][l])
                {
                    long long sum=0;
                    for(int d=l;d<n;d++)
                    {
                        sum+=a[d];
                        if((sum&ans)==ans&&(sum&(1ll<<i)))
                            f[j+1][d+1]=1;
                    }
                }
        if(f[k][n])
            ans|=1ll<<i;
    }
    printf("%lld\n",ans);
    return 0;
}

E. Addition on Segments

還是非常好的dp
設f[i]為i為最大值時出現的最右位置,然後把修改操作按r排序,每次用修改操作更新f即可

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=10005;
int n,q,f[N];
struct qwe
{
    int l,r,x;
}a[N];
bool cmp(const qwe &a,const qwe &b)
{
    return a.r<b.r;
}
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p>‘9‘||p<‘0‘)
    {
        if(p==‘-‘)
            f=-1;
        p=getchar();
    }
    while(p>=‘0‘&&p<=‘9‘)
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
int main()
{
    n=read(),q=read();
    for(int i=1;i<=q;i++)
        a[i].l=read(),a[i].r=read(),a[i].x=read();
    sort(a+1,a+1+q,cmp);
    for(int i=1;i<=q;i++)
    {
        for(int j=n-a[i].x;j>=1;j--)
            if(f[j]>=a[i].l)
                f[j+a[i].x]=max(f[j+a[i].x],f[j]);
        f[a[i].x]=a[i].r;
    }
    int ans=0;
    for(int i=1;i<=n;i++)
        if(f[i]>0)
            ans++;
    printf("%d\n",ans);
    for(int i=1;i<=n;i++)
        if(f[i]>0)
            printf("%d ",i);
    return 0;
}

Avito Code Challenge 2018 A~E