CF 479 Div.3

A:水题

#include <iostream>

using namespace std;

int main()
{
    int n,k;
    while(cin>>n>>k)
    {
        while(k--)
        {
            if(n%10==0)
            {
                n/=10;
            }
            else
            {
                n--;
            }

        }
        cout<<n<<endl;
    }
    return 0;
}

B:还是水题。

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    while(cin>>n)
    {
        char s[105];
        int b[30][30]= {0};

        cin>>s;
        for(int i=0; i<n-1; i++)
        {
            char a[3];
            a[0]=s[i];
            a[1]=s[i+1];
            a[2]='\0';
            b[a[0]-'A'][a[1]-'A']++;
        }
        int ma=-1;
        char t1,t2;
        for(int i=0; i<30; i++)
        {
            for(int j=0; j<30; j++)
            {
                if(b[i][j]>ma)
                {
                    t1=(char)i+'A';
                    t2=(char)j+'A';
                       ma=b[i][j];
                }
            }
        }
        cout<<t1<<t2<<endl;
    }
    return 0;
}
C:if判断时最好分开写,不要一直else if,会出现意想不到的错误!
#include <bits/stdc++.h>

using namespace std;
int n,k,a[200010];
int main()
{

    while(cin>>n>>k)
    {
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        sort(a,a+n);
        if(k==0)
        {
            if(a[0]>1)
            cout<<"1";
            else
                cout<<-1;
        }
        else if(k==n)
        {
            cout<<a[n-1];
        }
        else
        {
            if(a[k]==a[k-1])
                cout<<-1;
            else
                cout<<a[k-1];
        }
        cout<<endl;
    }
    return 0;
}

D:拓扑排序

#include <bits/stdc++.h>

using namespace std;
#define maxn 105
typedef long long ll;
vector<ll> ma[maxn];
//vector<ll> num;
ll num[maxn];
int in[maxn]={0};
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>num[i];
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(i==j)
                    continue;
                if((num[i]%3==0&&num[i]/3==num[j])||(num[i]*2==num[j]))
                {
                    ma[i].push_back(j);
                    in[j]++;
                }
            }
        }
        int cnt=0;
        vector<ll> ans;
        while(1)
        {
            for(int i=0;i<n;i++)
            {
                if(in[i]==0)
                {
                    in[i]=-1;
                    cnt++;
                    ans.push_back(num[i]);
                    for(int j=0;j<ma[i].size();j++)
                    {
                        in[ma[i][j]]--;
                    }
                    break;
                }
            }
            if(cnt==n)
                break;
        }
        for(int i=0;i<ans.size();i++)
        {
            cout<<ans[i]<<" ";
        }
    }
    return 0;
}

num不能用vector声明,,如果那样的话不能直接cin>>num[i]。

E:并查集(因为是找单环的个数,所以合并度为2的点)

#include <bits/stdc++.h>

using namespace std;
#define maxn 200010
struct a
{
    int x,y;
    a(int x,int y):x(x),y(y){}
    a(){}
};
int pre[maxn];
int du[maxn]={0};
int cnt=0;
int Find(int x)
{
    int t,p=x;
    while(x!=pre[x])
    {
        x=pre[x];
    }
    while(x!=p)
    {
        t=pre[p];
        pre[p]=x;
        p=t;
    }
    return x;
}
void join(int x,int y)
{
    x=Find(x);
    y=Find(y);
    if(x==y)
        cnt++;
    else
        pre[y]=x;
}
int main()
{
    int x,y;
    for(int i=0;i<maxn;i++)
    {
        pre[i]=i;
    }
    int n,c;
    a a[maxn];
    while(cin>>n>>c)
    {
        for(int i=0;i<c;i++)
        {
            cin>>x>>y;
            du[a[i].x=x]++;
            du[a[i].y=y]++;
        }
        for(int i=0;i<c;i++)
        {
            if(du[a[i].x]==2&&du[a[i].y]==2)
                join(a[i].x,a[i].y);
        }
         cout<<cnt<<endl;
    }

    return 0;
}

F:最长上升连续子序列

#include <bits/stdc++.h>

using namespace std;
map<int,int> mp;
int main()
{
    int n;
    while(cin>>n)
    {
        int a[200010];
        for(int i=1;i<=n;i++)
        {
            int x;
            cin>>x;
            a[i]=x;
            mp[x]=mp[x-1]+1;
        }
        int maxx=0,pos;
        map<int,int>::iterator it;
        for(it=mp.begin();it!=mp.end();it++)
        {
            if(it->second>maxx)
            {
                maxx=it->second;
                pos=it->first;
            }
        }
        pos=pos-maxx+1;
        cout<<maxx<<endl;
        for(int i=1;i<=n;i++)
        {
            if(a[i]==pos)
            {
                cout<<i<<" ";
                pos++;
            }
        }
        cout<<endl;
    }
    return 0;
}

posted @ 2018-05-09 16:44  MCQ  阅读(108)  评论(0编辑  收藏  举报