Codeforces Round#649(Div.2)個人問題解(A,B,C)

2654 ワード

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を満たすことを求めます.|b 1-b 2|+|b 2-b 3|+...+|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を(b 1-bi)に現れなかった最小非負の整数.構想:まずa配列はインクリメントシーケンスでなければ実現できない.a 1が1より大きいと実現できない.その上で循環処理を行い、aiがai-1に等しくなければbiはai-1の位置を記入すべきである.そうしないと、最初のa配列に現れなかった値を見つけてbiに与える.例えば:元の配列:1 1 2 44 6 8 b 1(1番目に現れない値は0)=0 b 2(2番目に現れない値は3)=3 b 3(a 3!=a 2)=a 2=1 b 4=a 3=2 b 5=5 b 6=7 b 7=4 b 8=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