CF Round #481 (Div. 3) 解题报告

版权声明:copy right https://blog.csdn.net/qq_43521140/article/details/89887516


Source

A. Remove Duplicates

题意&&思路:
差不多就是一个去重

ACODE:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
const int MX = 20 + 7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
int a[55];
int num[1005];
int main(int argc, char const *argv[])
{
	int n;
	cin >> n;
	for(int i = 1;i <= n;++i)
	{
		cin >> a[i];
		num[a[i]]++;
	}
	int p = 0;
	for(int i = 1;i <= 1000;++i){
		if(num[i]) p++;
	}
	cout << p << endl;
	for(int i = 1;i <= n;++i)
	{
		if(num[a[i]] > 1){
			num[a[i]]--;
		}
		else if(num[a[i]] == 1){
			num[a[i]]--;
			cout << a[i] << " ";
		}
	}
	cout << endl;
	return 0;
}

B. File Name

题意&&思路:
暴力

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
const int MX = 1e2 + 7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
char a[MX];
int main(int argc, char const *argv[])
{
	int n;
	cin >> n;
	for(int i = 1;i <= n;++i)
		cin >> a[i];
	int flag = 0;
	int num = 0;
	int ans = 0;
	for(int i = 1;i <= n;++i)
	{
		if(!flag && a[i] != 'x') continue;
		else if(flag && a[i] != 'x'){
			flag = 0;
			if(num >= 3){
				ans += (num - 2);
			}
			num = 0;
		}
		else if(!flag){
			num ++;
			flag = 1;
		}
		else {
			num++;
		}
	}
	if(num >= 3){
		ans += (num-2);
	}
	cout << ans << endl;
	return 0;
}

C. Letters

题意&&思路:
二分+前缀和

ACODE:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
const int MX = 2e5 + 7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
ll a[MX];
ll pre[MX];
int main(int argc, char const *argv[])
{
	int n,m;
	cin >> n >> m;
	for(int i = 1;i <= n;++i){
		cin >> a[i];
		pre[i] = pre[i-1] + a[i];
	}
	while(m--){
		ll x;
		cin >> x;
		int p = lower_bound(pre+1,pre+1+n,x) - pre;
		cout << p << " " << (x - pre[p-1]) << endl;
	}
	return 0;
}

D. Almost Arithmetic Progression

题意&&思路:
给你一个数列,可以对每一个元素进行最多一次add one /subtract one 操作,问你最少需要多少次操作才能使得该数列成为等差数列。
仔细思考我们不难发现:若第一个元素和第二个元素已经确定,那么整个数列若要成为等差数列,则后续元素是唯一确定的;换句话说,我们可以枚举前两个元素的(3*3)种状态,然后依次判断后续元素是否能依靠题中所给的两种操作修改后满足等差数列,计算出9种情况中满足条件的情况的操作数取最小值即可。

ACODE:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
const int MX = 1e5 + 7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
ll a[MX];
ll b[MX];
int main(int argc, char const *argv[])
{
	int n;
	int ans = INF;
	cin >> n;
	for(int i = 1;i <= n;++i){
		cin >> a[i];
	}
	int num = 0;
	if(n == 1 || n == 2){
		cout << 0 << endl;
		return 0;
	}
	for(int k = 1;k <= 3; ++k){
		for(int j = 1;j <= 3;++j){
			for(int i = 1;i <= n;++i) b[i] = a[i];
			if(k == 1){
				if(j == 2){
					num = 1;
					b[2]++;
				}
				else if(j == 3){
					num = 1;
					if(b[2] == 0) continue;
					else b[2]--;
				}
			}
			else if(k == 2){
				b[1]++;
				num = 1;
				if(j == 2){
					num = 2;
					b[2]++;
				}
				else if(j == 3){
					num = 2;
					if(b[2] == 0) continue;
					else b[2]--;
				}
			}
			else if(k == 3){
				if(b[1] == 0) continue;
				else b[1]--;
				num = 1;
				if(j == 2){
					num=2;
					b[2]++;
				}
				else if(j == 3){
					num = 2;
					if(b[2] == 0) continue;
					else b[2]--;
				}
			}
			int d = b[2] - b[1];
			int flag = 0;
			for(int i = 3;i <= n;++i){
				if(abs(b[i] - b[i-1] - d) > 1){
					flag = 1;
					break;
				}
				else if(abs(b[i] - b[i-1] - d) == 1){
					num++;
					if(b[i] - b[i-1] - d == 1){
						if(b[i] == 0){
							flag = 1;
							break;
						}
						b[i]-=1;
					}
					else b[i] +=1;
				}
			}
			if(flag) continue;
			else {
				ans = min(ans,num);
				num = 0;
			}
		}
	}
	if(ans == INF) ans = -1;
	cout << ans << endl;
	return 0;
}

E. Bus Video System

题意&&思路:

一辆公交车过n个站,给出经过每个站后乘客人数的变化个数以及公交车最大载客量,求公交车初始人数一共有多少种情况。假设初始人数为x,则每一次经过站后,车上的人数都会变化。换句话说,车上的人数一共有n个状态,那么我们只需要保证这n个状态都在(0~n)人数之间即可,也就是解n个不等式,最终算出x的范围,最后再判断是否合法即可。

ACODE:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
const int MX = 1e3 + 7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
ll Min(ll a,ll b)
{
	if(a > b) return b;
	return a;
}
ll Max(ll a,ll b)
{
	if(a < b) return b;
	return a;
}
ll a[MX];
int main(int argc, char const *argv[])
{
	ll n,w;
	cin >> n >> w;
	ll now = 0;
	int flag = 0;
	ll l = 0,r = w;
	for(int i = 1;i <= n;++i)
	{
		cin >> a[i];
		now+=a[i];
		//x >= -now
		if(now > w || now < -w){
			flag = 1;
		}
		else if(now < 0){
			l = Max(l,-now);
		}
		//x <= w - now
		else{
			r = Min(r,w - now);
		}
	}
	if(flag || (r - l + 1 < 0)) cout << 0 << endl;
	else cout <<(r - l + 1)<< endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43521140/article/details/89887516