Codeforces 916

Dashboard - Codeforces Round 916 (Div. 3) - Codeforces

A. Problemsolving Log

题目大意:给定一个长度为n的字符串,对于每次出现的字符’x',代表思考这个‘x’问题1秒,对于‘A’问题至少需要1秒才能解决,‘B’问题需要2秒·······‘Z'问题需要26秒,判断可以解决多少问题

从头往后跑一遍,暴力更新即可。

        int n;
		cin >> n;
		string s;
		cin >> s;
		map<char, int> mp;
		for (int i = 0; i < n; i++) {
			mp[s[i]]++;
		}
		int ans = 0;
		for (char i = 'A'; i <= 'Z'; i++) {
			if (mp[i] >= i - 'A' + 1) ans++;
		}
		cout << ans << '\n';

B. Preparing for the Contest

题目大意:给定一个n和k,需要找到一个长度为n的数组a,且a内的数为1~n,满足a【t】<a【t+1】的数量为k

分析一下发现,所需要找的即为长度为k+1的上升序列,后面的为下降序列

那么,前k个数让它依次上升,第k+1个数设置为最大, 后面让它依次下降则可以找到满足的数组

        int n, k;
		cin >> n >> k;
		if (k == 0) {
			for (int i = 1; i <= n; i++) cout << n - i + 1 << ' ';
			cout << '\n';
		} else {
			for (int i = 1; i <= k; i++) {
				cout << i << ' ';
			}
			for (int i = n; i > k; i--) {
				cout << i << ' ';
			}
			cout << '\n';
		}

C. Quests

题目大意:给定两个数组a,b,对于每个任务 i,第一次完成时获得经验a【i】,之后完成该任务获得b【i】,能够做第 i 个任务的前提条件是 i 之前的每个任务都完成了至少一次,要求完成k次任务能获得的最大经验

对于每个任务节点,我们可以记录之前的每个节点的b的值的最大值,在每次决定是要选择向下走还是完成重复的任务节点时,选择两者相比较大的一个

        int dfs(int i, int now, int maxx) {
	        if (i > n || now <= 0) return 0;
	        maxx = max(b[i], maxx);
	        int x = dfs(i + 1, now - 1, maxx);
	        int y = maxx * (now - 1);
	        return a[i] + max(x, y);
        }
        cin >> n >> k;
		for (int i = 1; i <= n; i++) cin >> a[i];
		for (int i = 1; i <= n; i++) cin >> b[i];
		cout << dfs(1, k, 0) << '\n';

D. Three Activities

题目大意:某位时间管理大师想要陪朋友玩,共三个项目,每个项目每天玩的朋友不同,该时间管理大师一天只能玩一个项目,他想要一起玩的朋友最大化

可以发现对于每个项目,我们只需要知道这个项目玩的人数最多的三天

共三个项目,那么就是九个数据

对于这九个数据,首先判断其中是不是有天数相同的,先排除掉,然后找到他们组合之后获得的最大值即可

        const int N = 2e5 + 10;
        int a[N], b[N], c[N];
        bool st[N];
        pair<int, int> p1[N], p2[N], p3[N];
        #define x first
        #define y second
        int n;
		cin >> n;
		for (int i = 1; i <= n; i++) {
			cin >> a[i];
			p1[i] = {a[i], i};
		}
		for (int i = 1; i <= n; i++) {
			cin >> b[i];
			p2[i] = {b[i], i};
		}
		for (int i = 1; i <= n; i++) {
			cin >> c[i];
			p3[i] = {c[i], i};
		}
		sort(p1 + 1, p1 + 1 + n);
		sort(p2 + 1, p2 + 1 + n);
		sort(p3 + 1, p3 + 1 + n);
		int ans = 0;
		for (int i = n; i >= n - 2; i--) {
			for (int j = n; j >= n - 2; j--) {
				for (int k = n; k >= n - 2; k--) {
					if (p1[i].y == p2[j].y || p1[i].y == p3[k].y || p2[j].y == p3[k].y)             
                         continue;
					ans = max(ans, p1[i].x + p2[j].x + p3[k].x);
				}
			}
		}
		cout << ans << '\n';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值