> 文章列表 > atcoder abc297A-E

atcoder abc297A-E

atcoder abc297A-E

Atcoder abc297简单讲讲

A

题意简述:
at老友(不说名字了)在弄电脑,一共点击了n次鼠标,当相邻两次点击的时间间隔不超过d时会出发双击,问第一次双击是在什么时候,如果没有输出-1
思路
简单题好吧,从1for到n判断a[i]和a[i+1]的间隔时间是否不超过d,若果是就输出一下
赛时code:

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define max3(x,y,z) max(x,max(y,z))
#define min3(x,y,z) min(x,min(y,z))
#define FOR(i,l,r) for(int i=(int)(l);i<=(int)(r);i++)
#define DOR(i,r,l) for(int i=(int)(r);i>=(int)(l);i--)
#define debug(x) cout<<#x<<'='<<x<<'\\n';
#define tomin(x,v) x=min(x,v)
#define tomax(x,v) x=max(x,v);
#define MKP make_pair
typedef long long LL;
typedef pair<int,int>PII;
const int N = 110;
int a[N];
int main() {int n, D; cin >> n >> D;for (int i = 1; i <= n; i ++ )cin >> a[i];for (int i = 1; i < n; i ++ )if (a[i + 1] - a[i] <= D) {cout << a[i + 1];return 0;}cout << -1;return 0;
}

B

题意简述:
给出一个字符串,判断是否满足下面两个条件:
1.对于任意一个数对(x,y)如果他们对应的字符都是B,则必须满足x,y的奇偶性不同
2.字符K的所在位置的两边必须都有R
思路:
第一个条件就是一个简单的抽屉,必须满足只有两个B并且其奇偶性不同
第二个条件就是首先找出K,然后直接从0-k,k-(size-1)for一下然后判断即可。
赛时code:

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define max3(x,y,z) max(x,max(y,z))
#define min3(x,y,z) min(x,min(y,z))
#define FOR(i,l,r) for(int i=(int)(l);i<=(int)(r);i++)
#define DOR(i,r,l) for(int i=(int)(r);i>=(int)(l);i--)
#define debug(x) cout<<#x<<'='<<x<<'\\n';
#define tomin(x,v) x=min(x,v)
#define tomax(x,v) x=max(x,v);
#define MKP make_pair
typedef long long LL;
typedef pair<int,int>PII;
vector<int> v;
int x, c;
int main() {string s; cin >> s;for (int i = 0; i < s.size (); i ++ ) {if (s[i] == 'B')v.push_back(i);if (s[i] == 'K')x = i, c ++;}if (v.size () != 2 || v[0] % 2 == v[1] % 2 || c != 1) {cout << "No";return 0;}int t1 = 0, t2 = 0;for (int i = 0; i < x; i ++ )if (s[i] == 'R') t1 = 1;for (int i = x; i < s.size (); i ++ )if (s[i] == 'R') t2 = 1;puts(t1 && t2? "Yes": "No");return 0;
}

C

题意简述:
给出T组数据,每组给出一个字符串,你可以每次讲相邻的两个"TT"变成"PC"知道没有相邻的两个T,求合并完后的字符串
思路:
模拟。for一下字符串,当s[I] == ‘T’ && s[i+1] == 'T’是改一下s[i]和s[i+1]
赛时code:

#include <bits/stdc++.h>
using namespace std;
int main () {int n, m;scanf ("%d%d", &n, &m);while (n -- ) {string s; cin >> s;for (int i = 0; i < m; i ++ )if (s[i] == 'T' && s[i + 1] == 'T')s[i] = 'P', s[i + 1] = 'C';cout << s << '\\n';}return 0;
}

D

题意简述:
给出A,B 当A!=B时进行操作:
若A>B A-=B
若A<B B-=A
思路:
模拟+优化。首先一个while循环(A!=B),接下来就是一个简单的优化想法:当A>B时,A有可能会减很多次才能<B,所以可以一次性算出A需要减多少次才能<=B:

cnt = A / B;
if (A % B == 0) cnt --;

代码就出来了
赛时code:

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define max3(x,y,z) max(x,max(y,z))
#define min3(x,y,z) min(x,min(y,z))
#define FOR(i,l,r) for(int i=(int)(l);i<=(int)(r);i++)
#define DOR(i,r,l) for(int i=(int)(r);i>=(int)(l);i--)
#define debug(x) cout<<#x<<'='<<x<<'\\n';
#define tomin(x,v) x=min(x,v)
#define tomax(x,v) x=max(x,v);
#define MKP make_pair
typedef long long LL;
typedef pair<int,int>PII;
int main() {LL A, B; cin >> A >> B;LL cnt = 0;while (A != B) {if (A < B) swap (A, B);if (B == 1) {cout << cnt + A - 1;return 0;}LL t = A / B;if (A % B == 0) t --;A -= t * B;cnt += t;}cout << cnt;return 0;
}

E

要上学了题意不放了(滑稽
思路:
我们可以首先想到一个类似搜索的过程,假设最后一个买的是第x个物品,那么有两种选择:
再卖一个第x个物品
卖x后面的物品(和前面物品的搭配已经算过了)
我们可以把这些情况的价格都记一下
所以我们可以用小根堆来维护(记)这些价格,进行K+1次即可。
因为最开始的一次我们需要讲所有基础(及ai)入堆
赛时code:

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define max3(x,y,z) max(x,max(y,z))
#define min3(x,y,z) min(x,min(y,z))
#define FOR(i,l,r) for(int i=(int)(l);i<=(int)(r);i++)
#define DOR(i,r,l) for(int i=(int)(r);i>=(int)(l);i--)
#define WL(n) while(n--)
#define debug(x) cout<<#x<<'='<<x<<'\\n';
#define tomin(x,v) x=min(x,v)
#define tomax(x,v) x=max(x,v);
#define MKP make_pair
typedef long long LL;
typedef pair<LL,int>PII;
const int N = 2e5 + 10;
int n, K, a[N];
priority_queue<PII, vector<PII>, greater<PII> > q;
map<LL, bool> mp;
int _;
LL X;
int main() {scanf ("%d%d", &n, &K), ++ K;FOR (i, 1, n)scanf ("%d", &a[i]);q.push (make_pair (0, 1)), mp[0] = 1;while (K -- ) {PII dat = q.top (); q.pop ();X = dat.fi, _ = dat.se, mp[X] = 0;FOR (i, _, n)if (! mp[X + a[i]]) {mp[X + a[i]] = 1;q.push (make_pair (X + a[i], i));}}printf ("%lld", X);return 0;
}