1. 程式人生 > >Codeforces Round #499 (Div. 2) 題解

Codeforces Round #499 (Div. 2) 題解

A

給一堆可用的字母,字母權值等於字母序號(a=1 b=2…),從小到大選一些字母出來排列,但是後一個和前一個至少要隔1個(a可以接c不能接a,b),一共選n個,問最小權值和。標記一下哪些字母出現瞭然後從小到大來一遍就好了。

B

有一些編了號的食物,有一些隊伍要出征,每一隻出征的隊伍出征期間吃的食物的編號要一樣,問最多可以出征幾天。
二分天數,求食物最多可以供應多少支隊伍。

C

有一艘飛船,在n個星球上遨遊,路徑1->2->3-> … ->n->1,離開每個星球和到達每個星球的時候都需要消耗一定的燃料(每個星球引數不同),問開始時至少要帶多少燃料。

二分需要攜帶的燃料數,模擬一遍就完事兒。

D

互動題,1e9的數軸上有一個點,可以詢問一個位置,對於大於小於等於的情況分別給出-1,0,1的答案。但是現在回答器壞了,有一個長度為n的01序列,並且序列無限迴圈,假設當前回答是第i個,如果序列上i是1.正確回答,否則給出正確答案的相反數,不超過60次問出這個點的位置。

注意到n<=30前n次詢問1這個位置,答案肯定是1或者0,0好說,如果是-1,那肯定這個01序列這個位置是0,問n次問出來,後三十次直接二分詢問就可以了。

E

給一個數組,任意選裡面的數,求sum%k有多少種情況,n個數能組成的數一定是這n個數的gcd,由擴充套件歐幾里得擴充套件得來,求gcd注意過濾0,求了n個數gcd還沒完,因為可以%,所以還要跟k求gcd,就是這裡忘了,掛的很慘。

F

給一棵樹,葉子結點是布林值,非葉子節點是邏輯運算子,問按序號從小到大依次對葉子結點值取反之後整棵樹答案是多少(每次只更改一個) 1e6
大概是想了。。20min。先dfs一遍把每個節點初始值算出來,然後第二遍dfs三個東西,當前結點,當前結點為0/1時整棵樹的答案,然後分情況往下傳遞,遇到葉子就可以直接知道答案了。

寫的實在是簡單粗暴 待會優化一下程式碼

這場沒上紫是真的菜。

A


 //QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i) using namespace std; int vis[100]; char s[100]; int main() { int n,k;cin>>n>>k; scanf("%s",s+1); for(int i=1;i<=n;++i) vis[s[i]-'a'+1]=1; int c=0,ans=0; for(int i=1;i<=26;++i) if(vis[i]) { ans+=i; if(++c>=k)break;++i; } if(c==k) cout<<ans<<endl; else cout<<-1<<endl; return 0; }

B

//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;

const int maxn=100+10;

int a[maxn],c[maxn];

int m,n;
inline int check(int mid)
{
    int cnt=0;
    for(int i=1;i<=100;++i)
    {
        cnt+=c[i]/mid;
    }
    return cnt>=m;
}

int main()
{
    cin>>m>>n;

    rep(i,1,n) {cin>>a[i];++c[a[i]];}

    if(m>n) {puts("0");return 0;}

    int l=1,r=n/m,mid,ans;
    while(l<=r)
    {
        mid=(l+r)>>1;
        if(check(mid))  l=mid+1,ans=mid;
        else r=mid-1;
    }

    cout<<ans<<endl;

    return 0;
}

C

//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;

int n,m;

const int maxn=1000+10;

int a[maxn],b[maxn];

inline int check(double ans)
{
    double cur=m+ans;
    rep(i,1,n)
    {
        double t=cur/a[i];
        if((cur-=t) < m) return 0;
        if(i==n) t=cur/b[1];    
        else t=cur/b[i+1];
        if((cur-=t) < m) return 0;
    }
    return 1;
}

int main()
{
    cin>>n>>m;

    rep(i,1,n) cin>>a[i];
    rep(i,1,n) cin>>b[i];

    double l=0,r=1e9,mid;
    if(!check(1e9+1e8)) {puts("-1");return 0;}

    while(r-l > 1e-8)
    {
        mid=(l+r)/2;
        if(check(mid)) r=mid;
        else l=mid;
    }

    printf("%.8f",(l+r)/2);

    return 0;
}

D

//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;

int n,m;

const int maxn=30+10;

int tr[maxn];

inline int query(int x){
    printf("%d\n",x);fflush(stdout);
    int t;cin>>t;return t;  
}

int OK=0;
inline int check(int x,int id)
{
    int k=query(x);
    if(tr[id]==-1) k=-k;
    if(k==-1) return 0;
    if(k==1) return 1;
    OK=1;return 0;
}

int main()
{
    cin>>m>>n;

    if(m==1) {query(1);return 0;}

    rep(i,1,n)
    {
        tr[i]=query(1);
        if(tr[i]==0) return 0;  
    }

    int l=1,r=m,mid,c=0;
    while(l<=r)
    {
        mid=(l+r)>>1;if(++c == n+1) c=1;
        if(check(mid,c)) l=mid+1;
        else r=mid-1;

        if(OK) {return 0;}
    }

    return 0;
}

E

//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;

const int maxn=100000+10;

int a[maxn];

int gcd(int a,int b){return b?gcd(b,a%b):a;}

int main()
{
    int n,k;cin>>n>>k;
    rep(i,1,n) {scanf("%d",a+i);a[i]%=k;}

    int g=0;
    rep(i,1,n){
        if(g==0) g=a[i];
        else if(a[i]) g=gcd(g,a[i]);
    }

    if(g==0) {printf("1\n0");return 0;}
    g=gcd(g,k); 

    int sz=(k-1)/g;
    cout<<sz+1<<endl;
    rep(i,0,sz) printf("%d ",i*g);
    return 0;
}

F

//QWsin
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;

const int maxn=1000000+10;

char s[maxn][5];
int val[maxn],ch[maxn][2];


int vv[maxn],ans[maxn];

int DFS(int cur)
{
    int ret;
    if(s[cur][0]=='I') ret= val[cur];
    if(s[cur][0]=='A'){
        ret= DFS(ch[cur][0]) & DFS(ch[cur][1]);
    }
    if(s[cur][0]=='O')
    {
        ret= DFS(ch[cur][0]) | DFS(ch[cur][1]);
    }
    if(s[cur][0]=='X')
    {
        ret= DFS(ch[cur][0]) ^ DFS(ch[cur][1]);
    }
    if(s[cur][0]=='N') ret= !DFS(ch[cur][0]);
    vv[cur]=ret;return ret;
}

void dfs(int cur,int ans1,int ans0)
{
    int l=ch[cur][0],r=ch[cur][1];
    if(s[cur][0]=='I')
    {
        int t;
        if(val[cur]==0) t=ans1;
        else t=ans0;
        ans[cur]=t;
//      printf("%d %d\n",cur,t);
        return ;    
    }
    if(s[cur][0]=='A')
    {
        if(vv[l]==0 && vv[r]==1) {dfs(l,ans1,ans0);dfs(r,ans0,ans0);}
        if(vv[l]==1 && vv[r]==0) {dfs(l,ans0,ans0);dfs(r,ans1,ans0);}
        if(vv[l]==0 && vv[r]==0) {dfs(l,ans0,ans0);dfs(r,ans0,ans0);}
        if(vv[l]==1 && vv[r]==1) {dfs(l,ans1,ans0);dfs(r,ans1,ans0);}
    }
    if(s[cur][0]=='O')
    {
        if(vv[l]==0 && vv[r]==1) {dfs(l,ans1,ans1);dfs(r,ans1,ans0);}
        if(vv[l]==1 && vv[r]==0) {dfs(l,ans1,ans0);dfs(r,ans1,ans1);}
        if(vv[l]==0 && vv[r]==0) {dfs(l,ans1,ans0);dfs(r,ans1,ans0);}
        if(vv[l]==1 && vv[r]==1) {dfs(l,ans1,ans1);dfs(r,ans1,ans1);}
    }
    if(s[cur][0]=='X')
    {
        if(vv[l]==0 && vv[r]==1) {dfs(l,ans0,ans1);dfs(r,ans1,ans0);}
        if(vv[l]==1 && vv[r]==0) {dfs(l,ans1,ans0);dfs(r,ans0,ans1);}
        if(vv[l]==0 && vv[r]==0) {dfs(l,ans1,ans0);dfs(r,ans1,ans0);}
        if(vv[l]==1 && vv[r]==1) {dfs(l,ans0,ans1);dfs(r,ans0,ans1);}
    }
    if(s[cur][0]=='N') dfs(ch[cur][0],ans0,ans1);
}

int main()
{
    int n;cin>>n;

    rep(i,1,n)
    {
        scanf("%s",s[i]);
        if(s[i][0]=='I')  scanf("%d",val+i);
        else if(s[i][0]!='N'){
            int a,b;
            scanf("%d%d",&a,&b);if(a>b) swap(a,b);
            ch[i][0]=a;
            ch[i][1]=b;
        }
        else{
            int a;
            scanf("%d",&a);
            ch[i][0]=a;
        }
    }

    memset(ans,-1,sizeof ans);
    vv[1]=DFS(1);
    dfs(1,1,0);

    for(int i=1;i<=n;++i) if(ans[i]!=-1)printf("%d",ans[i]);

    return 0;
}