atcoder abc297A-E

Atcoder abc297简单讲讲

A

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

#include 
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 
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 
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 思路:
模拟+优化。首先一个while循环(A!=B),接下来就是一个简单的优化想法:当A>B时,A有可能会减很多次才能

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

代码就出来了
赛时code:

#include 
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 
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;
}



你可能感兴趣的:(c++,算法,图论)