Codeforcesラウンド#464(本部2)

無意識のうちに、ほぼ二ヶ月が新年祝うためにCFを取り戻すために、今年の年、ちょうど大晦日の前に家を取得するので、忙しい、アナログとデジタル1月のレビュー+で、タイトルを書いていません

しかし、小さな一口、2時間のレースを持っている、体温がVIMと活力の前にも、すべての道を上昇したゲーム、および他のゲームが直接発熱前より一週間以上自宅で死んで嘘を嘘、39度まで急騰したが、また、自分自身珍しい休憩とみなさ終え第四の問題の発見は、FST、および欲求不満で、すぐにそれを見た後のチャンス、これがポイントに良い機会だと思いました


A.ラブトライアングル

アイデア:3員環を決定するための簡単な問題で、各列挙は3元の終わり場合に開始点として見て、再びそれを見つけるためにポイントを開始します

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 5000+10;

int f[maxn];

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        bool love = false;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&f[i]);
        }
        if(n==2)
        {
            printf("NO\n");
            continue;
        }
        for(int i=1;i<=n;i++)
        {
            if(f[f[f[i]]] == i)
            {
                love = true;
                break;
            }
        }
        if(love)
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}

B.ハムスターファーム

アイデア:シンプルな欲の問題、そこに1例のみで、残存価額を最小限に抑えるために、その後、貪欲なシークを満たさなければならないので、は、最終的な結果は、超int型のノートをとることができ、加えて、長い長い、それは小さなピットとみなさ

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 1e5+10;
/*
typedef struct HAMSTER
{
    long long a;
    int d;
}Hamster;

Hamster h[maxn];

bool cmp(const Hamster &h1,const Hamster &h2)
{
    if(h1.a<=h2.a&&h1.d<=h2.d)
    {
        return true;
    }
    else
    {
        return false;
    }
}

long long a[maxn];*/

int main()
{
    long long n,k;
    while(scanf("%I64d%I64d",&n,&k)!=EOF)
    {
        int mind = 0;
        long long num;
        long long lef = n + 1LL;
        for(int i=1;i<=k;i++)
        {
            long long a;

            scanf("%I64d",&a);
            long long temp = n%a;
            if(temp < lef)
            {
                lef = temp;
                num = n/a;
                mind = i;
            }
        }
        printf("%d %I64d\n",mind,num);
        /*long long mina = 1e18+10;
        int mind = 0;
        for(int i=0;i<k;i++)
        {
            scanf("%I64d",&h[i].a);
            h[i].d = i+1;
            if(h[i].a < mina)
            {
                mina = h[i].a;
                mind = h[i].d;
            }
        }*/
        /*for(int i=0;i<k;i++)
        {
            cout << h[i].a << "*" << h[i].d <<endl;
        }
        sort(h,h+k,cmp);*/
//        printf("%d %d\n",mind,(int)(n/mina));
        /*for(int i=0;i<k;i++)
        {
            cout << h[i].a << "*" << h[i].d <<endl;
        }*/
    }
    return 0;
}


みんなのための便利なC.

アイデア:選択した会議の時間、その人が会議に参加することができた地域の多くと同じではありません

短い時間のために、この問題の最適化問題は、当然のことながら、各時点を決定するために比較して列挙することで、どのようなことができますシミュレート

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 3e5+10;

int a[maxn];

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        //memset(d,0,sizeof(d));
        int s,f;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        scanf("%d%d",&s,&f);
        int st = s;
        int en = f-1;
        int maxnum = 0;
        int lastnum = 0;
        int maxt = 1;
        for(int t = st;t <=en;t++)
        {
            maxnum += a[t];
        }
        lastnum = maxnum;
        for(int t = 2; t<=n; t++)
        {
            int tempnum = lastnum;
            st--;
            if(st == 0)
            {
                st = n;
            }
            tempnum = tempnum - a[en] + a[st];
            en--;
            if(en == 0)
            {
                en = n;
            }
            if(tempnum > maxnum)
            {
                maxnum = tempnum;
                maxt = t;
            }
            lastnum = tempnum;
            //cout << t << "#" << tempnum << endl;
        }
        printf("%d\n",maxt);
        //cout << maxnum <<  "*" << endl;
    }
    return 0;
}

D.ラブレスキュー

アイデア:改良された実施例を提供するために、文字の二つの文字列、ほとんど変化などの文字の2等の同一の文字列の場合

オリジナルのアイデアは、変化の差がある場合は、文字を列挙することで、ばらばらのセットのレコードを持ちます

最後に、長い時間のためのプログラムを書いていない、我々は注意を払う必要がありますので、ばらばらのセット前ああ、発見、または完全に圧縮されていない、巨大なピットああを使用していません

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 1e5+10;

char pullover[maxn],shirt[maxn];
char re1[maxn],re2[maxn];

int pre[30];

int finds(int x)
{
    int r = x;
    while(pre[r]!=r)
	{
        r = pre[r];
    }
    int i=x ,j;
    while(pre[i]!=r)
	{
        j = pre[i];
        pre[i] = r;
        i = j;
    }
    return r;
}



void join(int x,int y)
{
    int fx = finds(x);
    int fy = finds(y);
    if(fx > fy)
	{
		int temp = fx;
		fx = fy;
		fy = temp;
	}
    if(fx!=fy)
	{
        pre[fy] = fx;
    }
}


int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int sum = 0;
        for(int i=1;i<=26;i++)
        {
            pre[i] = i;
        }
        scanf("%s%s",pullover,shirt);
        for(int s1=1;s1<=26;s1++)
        {
            for(int s2=1;s2<=26;s2++)
            {
                if(finds(s1)==finds(s2))
                {
                    continue;
                }
                for(int i=0;i<n;i++)
                {
                    if((finds(pullover[i]-'a'+1)==finds(s1)&&finds(shirt[i]-'a'+1)==finds(s2))||(finds(pullover[i]-'a'+1)==finds(s2)&&finds(shirt[i]-'a'+1)==finds(s1)))
                    {
                        re1[sum] = s1;
                        re2[sum] = s2;
                        sum++;
                        //cout << 'a' + s1 - 1 << 'a' + s2 - 1 << 'a' + finds(s1) - 1 << 'a' + finds(s2) - 1 << endl;
                        join(s1,s2);
                        break;
                    }
                }
            }
        }
        printf("%d\n",sum);
        for(int i=0;i<sum;i++)
        {
            printf("%c %c\n",re1[i]+'a'-1,re2[i]+'a'-1);
        }
    }
    return 0;
}



公開された97元の記事 ウォン称賛89 ビュー20000 +

おすすめ

転載: blog.csdn.net/Owen_Q/article/details/79469855