Codeforces Round #649 (Div. 2)个人题解(A,B,C)

A题:
题意:给你一个数组,找到一个最长数列的和不能被x整除,该数列只能由原数列从第一个开始删除,或者从最后一个开始删除(必须连续删除)。
思路:直接设一个前缀和数组,循环一遍判断最大值就行了。如果全部元素都能被x整除,那就直接输出-1。

#include
#include
#include
#include
#include
#define MAX 100005
typedef long long ll;
using namespace std;

int arr[MAX];
int pre[MAX];
 
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		int n,x;
		cin >> n >> x;
		int flag=0;
		int sum=0;
		for(int i=0;i

B题:
题意:给你一个数组a,求a的子序列b满足
1.|b1-b2|+|b2-b3|+…+|bn-1-bn|最大;
2.在1的基础上满足b中元素个数最小。
思路:当ai-ai+k为递增,递减,相等时,b数组中只要取ai和ai+k就可以了。

#include
#include
#include
#include
#include
#include
#include
#define MAX 100005
using namespace std;
 
int arr[MAX];
int ans[MAX];
 
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		int n;
		cin >> n;
		int cnt=0;
		scanf("%d %d",&arr[0],&arr[1]);
		ans[cnt++]=arr[0];
		int flag=0;\\0表示相等,1表示递增,-1表示递减
		if(arr[1]>arr[0]) flag=1;
		else if(arr[1]arr[i-1])
				{
					ans[cnt++]=arr[i-1];
					flag=1;
				}
				else if(arr[i]=arr[i-1])
			{
				if(arr[i]==arr[i-1])
				{
					ans[cnt++]=arr[i-1];
					flag=0;
				}
				else if(arr[i]>arr[i-1])
				{
					ans[cnt++]=arr[i-1];
					flag=1;
				}
			}
		}
		ans[cnt++]=arr[n-1];
		cout << cnt <

C题:
题意:给你一个数组a,求出数组b使得ai是(b1-bi)中未出现过的最小非负整数。
思路:首先a数组必须是递增序列,否则无法实现,如果a1大于1那也无法实现,在此基础上进行循环处理,如果ai不等于ai-1的话,那么bi就应该把ai-1的位置给填上,否则找出首个a数组中没出现的值赋给bi。
例如:
原数组:1 1 2 4 4 4 6 8
b1(第一个未出现的值为0)=0
b2(第二个未出现的值为3)=3
b3(a3!=a2)=a2=1
b4=a3=2
b5=5
b6=7
b7=4
b8=6

#include
#include
#include
#include
#include
#include
#include
#define MAX 100005
using namespace std;

int arr[MAX];
int ans[MAX];
bool vist[MAX];

int main()
{
	int n;
	cin >> n;
	int flag=1;
	for(int i=0;i

你可能感兴趣的:(Codeforces Round #649 (Div. 2)个人题解(A,B,C))