版权声明: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的范围,最后再判断是否合法即可。
扫描二维码关注公众号,回复:
6519169 查看本文章
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;
}