Codeforces Round 888 (Div. 3)ABC

Codeforces Round 888 (Div. 3)

目录

  • A. Escalator Conversations
    • 题目大意
    • 思路
    • 代码
  • B. Parity Sort
    • 题目大意
    • 思路
    • 代码
  • C. Tiles Comeback
    • 题目大意
    • 思路
    • 代码

A. Escalator Conversations

Codeforces Round 888 (Div. 3)ABC_第1张图片

题目大意

判断有多少个人能够通过站在楼梯上的操作和VLAD一样高或者是VLAD通过站在楼梯上的操作能和多少人一样高,求和
翻译:

有一天,弗拉德很好奇,在地铁的自动扶梯上他能和谁说话。一共有n名乘客。自动扶梯共有m级台阶,所有台阶的索引为1 ~
m,第i级台阶的高度为i⋅k。

弗拉德的身高是H厘米。身高a和b的两个人站在不同的台阶上,如果他们之间的高度差等于台阶之间的高度差,他们可以在自动扶梯上交谈。

例如,两个人身高分别为170厘米和180厘米,m=10,k=5,那么他们可以站在7号和5号台阶上,台阶之间的高度差等于两个人之间的高度差:k·2=5·2=10=180−170。还有其他可能的方法。

给定大小为n的数组h,其中hi表示第i个人的高度。弗拉德感兴趣的是在自动扶梯上他能和多少人单独交谈。

例如,如果n=5,m=3,k=3,H=11,H=[5,4,14,18,2],则Vlad可以与身高为5的人(Vlad站在第1步,另一个人站在第3步)和身高为14的人(Vlad站在第3步,另一个人站在第2步)进行对话。弗拉德无法与身高2的人交谈,因为即使他们站在自动扶梯的极端台阶上,他们之间的高度差也是6,而他们的高度差是9。弗拉德不能和电梯上的其他人交谈,所以这个例子的答案是2。

输入 第一行包含一个整数t(1≤t≤1000)——测试用例的数量。然后是测试用例的描述。

每个测试用例的第一行包含整数n、m、k、H(1≤n,m≤50,1≤k,H≤106)。这里,n是人数,m是步数,k是相邻步数之间的高度差,H是弗拉德的高度。

第二行包含n个整数:h1,h2,…,hn(1≤hi≤106)。这里,hi代表第i个人的身高。

输出 对于每个测试用例,输出一个整数——Vlad可以在自动扶梯上单独与之交谈的人数。

思路

站在楼梯上的操作就是增加或者是减少k的倍数,楼梯的阶梯数量就是这个倍数是由范围的,所以直接作差,然后需要判断这个差是不是k的倍数,如果不是k的倍数那么就肯定不能进行交谈,如果是k的倍数的话还需要进行范围的判断,都在范围的话就是能够进行交谈的人。

代码

#include
using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m,k,h;
        scanf("%d%d%d%d",&n,&m,&k,&h);
        int ans=0;
        for(int i=0;i<n;++i)
        {
            int shuru;
            scanf("%d",&shuru);
            int cha=(int)abs(h-shuru);
            if(cha%k!=0||cha==0)continue;
            if(cha/k<m)ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

B. Parity Sort

Codeforces Round 888 (Div. 3)ABC_第2张图片

题目大意

已知一个数组,可以对两个奇数或者偶数进行对换操作,询问是否能转换成有序数组
翻译:

你有一个长度为n的整数数组。你可以对给定的数组应用以下操作:

交换两个元素ai和aj使得i≠j,
ai和aj要么都是偶数,要么都是奇数。确定是否可以通过执行任意次数(可能为零)的操作来对数组进行非降序排序。

例如,设a =[7,10,1,3,2]。然后我们可以执行3个操作来对数组进行排序:

交换a3=1和a1=7,因为1和7是奇数。得到a = [1,10,7,3,2]; 交换a2=10和a5=2,因为10和2是偶数。得到a
=[1,2,7,3,10]; 交换a4=3和a3=7,因为3和7是奇数。得到a =[1,2,3,7,10]。

输入 输入数据的第一行包含一个整数t(1≤t≤104)——测试用例的数量。 下面是测试用例的描述。
每个测试用例的第一行包含一个整数n(1≤n≤2·105)-数组a的长度。

每个测试用例的第二行包含恰好n个正整数a1,a2,…,an(1≤ai≤109)——数组a的元素。

保证n除以所有测试用例的和不超过2⋅105。

输出 对于每个测试用例,在单独的行上输出:

如果数组可以通过对其进行一定次数的操作来排序,则为YES;否则为NO。 您可以在任何情况下输出YES和NO(例如,字符串YES, YES,
YES和YES将被识别为正响应)。

思路

在输入的过程中记录每一个数的奇偶性,然后直接对原来数组进行排序,如果能够按照题目的要求进行操作则该数组的初始状态奇偶性和排序之后的奇偶性一样,直接对比就能够得到答案

代码

#include
using namespace std;

const int N = (int)2e5+10;

int cmp(int a,int b)
{
    return a<b;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int a[N]{0},b[N]{0};
        for(int i=0;i<n;++i)
        {
            scanf("%d",&a[i]);
            b[i]=a[i]%2;
        }
        sort(a,a+n,cmp);
        bool pd=0;
        for(int i=0;i<n;++i)
            if((a[i]%2)!=b[i])
            {
                pd=1;
                break;
            }
        if(pd)printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}

C. Tiles Comeback

Codeforces Round 888 (Div. 3)ABC_第3张图片

题目大意

翻译:

弗拉德记得他有一串n块瓷砖和一个数字k。这些瓷砖从左到右编号,第i块瓷砖的颜色是ci。

如果你站在第一个贴图上并开始跳跃任意数量的贴图,你就可以得到一条长度为p的路径。路径的长度就是你所站的贴图的数量。

Vlad想看看是否有可能得到一个长度为p的路径,使得:

它在索引为n的tile处结束,p可以被k整除路径被分成长度为k的块,每个块中的tile具有相同的颜色,相邻块中的颜色不一定不同。例如,设n=14,
k=3。

瓷砖的颜色包含在数组c=[1,2,1,1,7,5,3,3,1,3,4,4,2,4]。然后我们可以构造一个长度为6的路径,包含两个块:
c1→c3→c4→c11→c12→c 14 第1块中的所有瓷砖的颜色为1,第2块中的所有瓷砖的颜色为4。

在这个例子中,我们也可以构造一个长度为9的路径,其中第1个方块的所有贴图的颜色是1,第2个方块的所有贴图的颜色是3,第3个方块的所有贴图的颜色是4。

输入 输入数据的第一行包含一个整数t(1≤t≤104)——测试用例的数量。

下面是测试用例的描述。

每个测试用例的第一行包含两个整数nand k(1≤k≤n≤2·105) )——该系列中瓦片的数量和块的长度。

每个测试用例的第二行包含n个整数c1,c2,c3,…,cn (1≤ci≤n)—瓷砖的颜色。

保证n除以所有测试用例的和不超过2⋅105。

输出 对于每个测试用例,在单独的行上输出:

如果您能得到满足这些条件的路径,则为;否则为否。 您可以在任何情况下输出YES和NO(例如,字符串YES, YES,
YES和YES将被识别为正响应)。

思路

分成长度为k的块,所以只需要特别判断一开始的数字能不能实现以及最后的哪一个数组能不能实现即可,需要特别注意一下一开始的数字和最后的数字一样的情况就好

代码

#include
using namespace std;

const int N = (int)2e5+10;

int cmp(int a,int b)
{
    return a<b;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        int a[N]{0};
        for(int i=0;i<n;++i)
            scanf("%d",&a[i]);
        int zhizhen1=0,zhizhen2=n-1;
        int geshu1=0,geshu2=0;
        while(zhizhen1<n&&geshu1<k)
        {
            if(a[zhizhen1]==a[0])
            {
                geshu1++;
            }
            zhizhen1++;
        }
        if(geshu1==k)zhizhen1--;
        while(zhizhen2>=0&&geshu2<k)
        {
            if(a[zhizhen2]==a[n-1])
            {
                geshu2++;
            }
            zhizhen2--;
        }
        if(geshu2==k)zhizhen2++;
        if(geshu1!=k||geshu2!=k)
        {
            printf("NO\n");
            continue;
        }
        if(a[0]==a[n-1])
        {
            if(geshu1==k)printf("YES\n");
            else printf("NO\n");
            continue;
        }
        else
        {
            if(zhizhen1>zhizhen2)printf("NO\n");
            else printf("YES\n");
            continue;
        }
        printf("\n\n");
    }
    return 0;
}

你可能感兴趣的:(ACM,算法,数据结构,c++,codeforces)