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
题目传送门:
题目大意:
给你一个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;