Codeforces Round #565 (Div. 3) A B C E

Codeforces Round #565 (Div. 3)

Divide it!

由题可知,分别消掉1个2,3,5分别需要1,2,3的花费

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll q,n;
int main(){
    cin>>q;
    while(q--){
        cin>>n;
        ll cnt=0;
        ll p=-1;
        int flag=0;
        while(p<cnt){
            p=cnt;
            if(n%2ll==0) {
                n=n/2ll;
                cnt++;
            }
            if(n%3==0){
                n=n/3ll;
                cnt+=2ll;
            }
            if(n%5ll==0){
                n=n/5ll;
                cnt+=3ll;
            }
            if(n==1) flag=1;
        }
    if(flag)cout<<cnt<<"\n";
    else cout<<"-1\n";
    }
    return 0;
}
View Code

 

Merge it!

将ai=ai%3(1<=ai<=1e9),统计 0 1 2的个数,res=a[0]+(1+2的个数)+剩余的1的个数/3或者剩余2的个数/3

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;


int t,n,a[4];
int main(){
    
    cin>>t;
    while(t--){
        for(int i=0;i<=2;i++){
            a[i]=0;
        }
        cin>>n;
        int c,res;
        for(int i=0;i<n;i++){
            cin>>c;
            c=c%3;
            a[c]++;
        }
        if(a[1]>a[2]){
            a[1]=a[1]-a[2];
            res=a[2];
            res=res+a[1]/3;
        }else{
            res=a[1];
            a[2]=a[2]-a[1];
            res+=a[2]/3;
        }
        res=res+a[0];
        cout<<res<<"\n";
    }
    return 0;
}
View Code

 

Lose it!

4,8,15,16,23,42 分别记为 1 2 3 4 5 6

b[i]表示有b[i]个从1到i连续的序列

if b[i-1]>0 那么b[i]++,b[i-1]--;

最后得到b[6]个从1到6连续的序列

需要删除的数 n-b[6]*6

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6;


int n;
int a[N],p[50],b[10]={0};
int main(){
    p[4]=1,p[8]=2,p[15]=3,p[16]=4,p[23]=5,p[42]=6;
    b[0]=N;
    cin>>n;
    int res=0;
    int c;
    for(int i=0;i<n;i++){
        cin>>c;
        if(b[p[c]-1]>0) b[p[c]]++,b[p[c]-1]--;
    }
    res=n-b[6]*6;
    cout<<res<<"\n";
    return 0;
}
View Code

 

Cover it!

二分染色,dfs bfs 都行,选择点少的颜色输出

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+100;

int t;
int n,m;
int vis[N];
int cnt[2];
struct Edge{
    int to,next;
}e[N*2];
int head[N],tot;
void addEdge(int u,int v){
    e[tot].to=v;
    e[tot].next=head[u];
    head[u]=tot++;
}

int dfs(int u,int c){
    vis[u]=c;
    cnt[c]++;
    for(int i=head[u];i!=-1;i=e[i].next){
        int v=e[i].to;
        if(vis[v]==-1){
            dfs(v,c^1);
        }
    }
}
int main(){
    std::ios::sync_with_stdio(false);
    cin>>t;
    while(t--){
        cin>>n>>m;
        memset(head,-1,sizeof(int)*(n+100));
        memset(vis,-1,sizeof(int)*(n+100));
        tot=0;
        cnt[0]=0,cnt[1]=0;
        int u,v;
        for(int i=0;i<m;i++){
            cin>>u>>v;
            addEdge(u,v);
            addEdge(v,u);
        }
        dfs(1,0);
        int c,d;
        if(cnt[0]>cnt[1]) c=1,d=cnt[1];
        else c=0,d=cnt[0];
        cout<<d<<"\n";
        for(int i=1;i<=n;i++){
            if(vis[i]==c) cout<<i<<" ";
        }
        cout<<"\n";
    }
    return 0;
}
View Code

 

posted @ 2019-06-11 17:15  Pikachu_Yj  阅读(140)  评论(0编辑  收藏  举报