Codeforces Round #688 (Div. 2) A~D题题解

A.Cancel the Trains

题目传送门:

A.Cancel the Trains

题目大意:

在这里插入图片描述
如图所示,竖向轨道的火车从最下面出发,横向轨道的火车从最左边出发,所有火车以相同的速度行驶,问你为了避免火车相撞,最少需要去除几辆火车。

思路:

因为速度都相同,所以题目数据中如果存在竖向火车的出发索引和横向火车的出发索引相同,那么必然会相撞,去除一辆。

AC Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int a[105];
int main()
{
   
    int t;
    scanf("%d",&t);
    while(t--)
    {
   
        int n,m;
        scanf("%d%d",&n,&m);
        int sum=0;
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)
        {
   
            int x;
            scanf("%d",&x);
            a[x]=1;
        }
        for(int i=1;i<=m;i++)
        {
   
            int x;
            scanf("%d",&x);
            if(a[x]==1) sum++;
        }
        printf("%d\n",sum);
    }
    //system("pause");
    return 0;
}

B. Suffix Operations

题目传送门:

B. Suffix Operations

题目大意:

给你一个n个整数的数列a。你可以进行两种操作:
1、后缀+1
2、后缀-1
你可以改变其中的任何一个数为任何整数,也可以不变,然后进行上述操作。问最少需要操作几次,才能使所有数相同。

思路:

看到这种后缀操作次数的题目,我的第一想法就是差分。我们可以想到,如果要所有数相等,那么差分数组除了第一个位置之外,后面的所有位置都应该为0。可以想到对后缀 a [ i ~ n ]进行操作的话,只会改变差分数组中d[ i ] 的值,对于i前面和后面的位置都没有影响。那么我们操作的目的就是要让差分数组的除第一个位置之外的值,都为0。如果题目中没有说可以改变一个数的值的话,答案就已经呼之欲出了。但是题目中还有这么一个操作,于是我们想到,如果减小a[ i ]的值,那么d [ i ]减小,d [ i + 1 ]增大;如果增加a[ i ]的值,那么d[ i ]增大,d[ i+1 ]减小。我们改变值的目的肯定是要减少操作次数,那么只要顺着枚举每个位置,然后看如果改变这个位置的值能减少多少次操作,最后取大即可。(第一个位置的操作和最后一个位置的操作与些许不同,具体看代码)

AC Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
LL a[N],d[N];
int main()
{
   
    int t;
    scanf("%d",&t);
    while(t--)
    {
   
        int n;
        
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值