Codeforces Round #401 (Div. 2)【A,B,C,D】

最近状态极差。。水题不想写,难题咬不动。。哎,CF的题那么简单,还搞崩了= =、真是巨菜无比。

Codeforces777A

题意:略。
思路:
构造出3!次变换,然后输出就好。
Code:

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

int a[6][4]={{1,2,3},{2,1,3},{2,3,1},{3,2,1},{3,1,2},{1,3,2}};

int main()
{
    int n,x;
    scanf("%d",&n);
    scanf("%d",&x);
    n%=6;
    int ans=a[n][x];
    ans--;
    printf("%d
",ans);
    return 0;
}



Codeforces777B

题意:

比较一下,小的数字的那个人要打一下。求第二串的最少,第一串的最多。

思路:(弱弱觉得有点意思)

两个数组,先排下序.

(1)我要少一些,我从大的去匹配对方,而且先与对方大的去匹配最优,如果不行,最小的来匹配。

(2)我要多一些,那么我小的尽可能去贴小的,同理不行的话,我拿最大的过去

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
char s1[1010],s2[1010];
int s[1010];
int m[1010];
int n;

void solve1()
{
    int k1=0,k2=0;
    int t1=n-1,t2=n-1;
    int ans1=0;
    while(k1<=t1&&k2<=t2)
    {
        if(m[t2]>=s[t1])
        {
            t1--;
            t2--;
        }
        else
        {
            t1--;
            k2++;
            ans1++;
        }
    }
    printf("%d
",ans1);
}

void solve2()
{
    int k1=0,k2=0;
    int t1=n-1,t2=n-1;
    int ans2=0;
    while(k1<=t1&&k2<=t2)     //小的贴小的,不行的话我最大的贴小的。
    {
        if(s[k1]<m[k2])
        {
            k1++;
            k2++;
            ans2++;
        }
        else
        {
            t1--;
            k2++;
        }
    }
    printf("%d
",ans2);
}

int main()
{
    scanf("%d",&n);
    scanf("%s%s",s1,s2);
    for(int i=0;i<n;i++)
        s[i]=s1[i]-'0';
    for(int i=0;i<n;i++)
        m[i]=s2[i]-'0';
    sort(s,s+n);
    sort(m,m+n);
    solve1();
    solve2();
    return 0;
}
/*
4
1234
2345
*/


Codeforces777C:

就是直接搞就好了,对于每列可以尺取,也可以拿个临时变量作为当前最远位置,这里是预处理出一个数组存每个位置的最远距离。

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10;
vector<int>xs[100010];
int num[100010];
int n,m;

void solve()
{
    for(int i=0;i<m;i++)
    {
    	int tmp=-1;
    	int L;
    	for(int j=0;j<xs[i].size();j++)
    	{
    		int a=xs[i][j];
    		if(tmp==-1)
    			L=j+1;
    		else if(tmp>a)
    		{
    			num[L]=max(num[L],j);
    			L=j+1;
			}
			tmp=a;
		}
		num[L]=max(num[L],n);
	}

	int tmp=-1;
	for(int i=1;i<=n;i++)
	{
		num[i]=max(num[i],tmp);
		tmp=max(num[i],tmp);
	}
}

int main()
{
    int x,y;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            {
                scanf("%d",&x);
                xs[j].push_back(x);
            }
    solve();
	int Q;
    scanf("%d",&Q);
    while(Q--)
    {
        scanf("%d%d",&x,&y);
        if(num[x]>=y)
            puts("Yes");
        else
            puts("No");
    }
    return 0;
}

Codeforces777D:

大水题。。

Code:

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

vector<char>xs[500010];
int n;
int len[500010];
char ss[500010];
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s",ss);
        int yy=strlen(ss);
        for(int j=0;j<yy;j++)
            xs[i].push_back(ss[j]);
    }
    int t1,t2;
    len[n-1]=xs[n-1].size();
    for(int i=n-2;i>=0;i--)
    {
        t1=0;t2=0;
        bool flag=true;
        if(len[i+1]==1)
        {
            len[i]=1;
            continue;
        }
        while(t1<len[i+1]&&t2<xs[i].size())
        {
            if(xs[i+1][t1]==xs[i][t2])
            {
                t1++;
                t2++;
            }
            else if(xs[i+1][t1]>xs[i][t2])
            {
                len[i]=xs[i].size();
                flag=false;
                break;
            }
            else
                break;
        }
        if(flag)
            len[i]=t2;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<len[i];j++)
            cout<<xs[i][j];
        puts("");
    }
    return 0;
}
/*
3
#sima
#simb
#sima
*/


原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777403.html