Codeforces Round #479 (Div. 3)

3 篇文章 0 订阅

D:Divide by three, multiply by two     除了这种做法还可以通过建图的方式

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[110], ans[110];
int n, flag=0;
map<ll , int >mp;

bool dfs(int f){
    if(f==n+1)
        return true;

    if(ans[f-1]%3==0 && mp[ans[f-1]/3])
    {
        ans[f]=ans[f-1]/3;
        mp[ans[f-1]/3]--;
        if(dfs(f+1)) return true;
        mp[ans[f-1]/3]++;
    }
    if(mp[ans[f-1]*2])
    {
        ans[f]=ans[f-1]*2;
        mp[ans[f-1]*2]--;
        if(dfs(f+1)) return true;
        mp[ans[f-1]*2]++;
    }

    return false;
}

int main(){
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
    {
         scanf("%I64d", num+i);
         mp[num[i]]++;
    }
    for(int i=1; i<=n; i++)
    {
        ans[1]=num[i];
        mp[num[i]]--;
        if(dfs(2))
            break;
        mp[num[i]]++;
    }

    for(int i=1; i<n; i++)
        printf("%I64d ", ans[i]);
    printf("%I64d\n", ans[n]);

    return 0;
}

E - Cyclic Components    除了搜索还可以用并查集

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int n, m;
vector<int> G[maxn];
int vis[maxn], ans=0, flag=0;

void dfs(int u, int f){

    int sz=G[u].size();
    if(sz!=2) flag=0;

    for(int i=0; i<sz; i++){
        if(G[u][i]!=f){
            if(!vis[G[u][i]]){
                vis[G[u][i]]=1;
                dfs(G[u][i], u);
            }
            else if(flag && vis[G[u][i]])
                ans++;
        }
    }

}

int main(){
    scanf("%d%d", &n, &m);
    int u, v;
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d", &u, &v);
        G[u].push_back(v);
        G[v].push_back(u);
    }

    for(int i=1; i<=n; i++){
        if(!vis[i]){
            vis[i]=1;
            flag=1;
            dfs(i, -1);
        }
    }
    printf("%d\n", ans/2);

    return 0;
}

F - Consecutive Subsequence  这个题应该的解法是dp,但是自己贪心模拟做出来的,第一个代码是自己写的,第二个是看了别人思路写的dp

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int n, t=0;
vector<int> seq[maxn];
map<int, int> mp;
int num[maxn], elem[maxn];

int main(){
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
        scanf("%d", elem+i);
    int mx=0, id;
    for(int i=1; i<=n; i++){
        if(!mp[elem[i]-1])
        {
            if(!mp[elem[i]])
            {
                seq[++t].push_back(i);
                num[t]++;
                if(mx<num[t]){
                    mx=num[t]; id=t;
                }
                mp[elem[i]]=t;
            }
        }
        else{
            if(!mp[elem[i]]){
                seq[mp[elem[i]-1]].push_back(i);
                num[mp[elem[i]-1]]++;
                mp[elem[i]]=mp[elem[i]-1];
                mp[elem[i]-1]=0;
                if(mx<num[mp[elem[i]]]){
                    mx=num[mp[elem[i]]]; id=mp[elem[i]];
                }
            }
            else{
                if(num[mp[elem[i]]]<num[mp[elem[i]-1]]+1){
                    int tt=mp[elem[i]-1];
                    seq[tt].push_back(i);
                    num[tt]++;
                    mp[elem[i]]=tt;
                    mp[elem[i]-1]=0;
                    if(mx<num[tt]){
                        mx=num[tt]; id=tt;
                    }
                }
            }
        }
    }
    int sz=seq[id].size();
    printf("%d\n", sz);
    for(int i=0; i<sz-1; i++){
        printf("%d ", seq[id][i]);
    }
    printf("%d\n", seq[id][sz-1]);
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int n, mx, ed;
map<int, int> dp;
int e[maxn];

int main(){

    scanf("%d", &n);
    for(int i=1; i<=n; i++)
    {
        scanf("%d", e+i);
        dp[e[i]]=max(dp[e[i]], dp[e[i]-1]+1);
        if(mx<dp[e[i]]){
            mx=dp[e[i]]; ed=e[i];
        }
    }
    int st=ed-dp[ed]+1;
    printf("%d\n", dp[ed]);
    for(int i=1; i<=n; i++)
    {
        if(st==ed && e[i]==st){
            printf("%d\n", i); break;
        }
        else if(e[i]==st)
        {
            printf("%d ", i);
            st++;
        }
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值