Codeforces Global Round 15

A题:Subsequence Permutation
题意:给定字符串s,选择k个位置并可以任意交换,求最小的k使s升序。
数据范围:多组输入t<1000,n<40
样例解释
4
3
lol
10
codeforces
5
aaaaa
4
dcba
输出:
2
6
0
4
第一组:lol->llo选择两个位置
思路:对字符串升序排序,符合的位置不用选,不符合的位置cnt++
分类:思维
通过代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
	int t;
	cin>>t;
	while(t--) {
		int n;
		string s;
		cin>>n>>s;
		string s1=s;
		sort(s1.begin(),s1.end());
		int cnt=0;
		for(int i=0; i<n; i++) {
			if(s[i]!=s1[i])cnt++;
		}
		cout<<cnt<<endl;
	}
	return 0;
}

B题:Running for Gold
题意:给定n个人,每个人有五个数据,两人相比如果有三组及以上数据更小,说明更优秀。求比所有人都优秀的人。
数据范围:多组输入t<1000,n<50000
样例解释
输入:
6
10 3
3 1 1 1 1 10 3 10 10 2
4 4
1 1 1 1
1 1
1
13 1
3 1 4 1 5 9 2 6 5 3 5 8 9
13 2
3 1 4 1 5 9 2 6 5 3 5 8 9
13 3
3 1 4 1 5 9 2 6 5 3 5 8 9
输出:
1 1 0 2 3 2 2 1 3 3
4 2 1 3
1
0 0 1 1 0 1 1 1 0 1 1 1 0
2 1 2 2 1 1 1 1 2 1 0 2 2
1 1 3 2 1 3 3 1 2 2 3 2 0
思路:找到一个可能的冠军,判断是不是真的冠军。
分类:思维
通过代码:

#include<bits/stdc++.h>
using namespace std;
struct node {
	int a,b,c,d,e;
} ss[300005];
int main() {
	int t;
	cin>>t;
	while(t--) {
		int n;
		cin>>n;
		for(int i=1; i<=n; i++) {
			cin>>ss[i].a>>ss[i].b>>ss[i].c>>ss[i].d>>ss[i].e;
		}
		int ans=1;
		int flag=1;
		for(int i=2; i<=n; i++) {
			int cnt=0;
			if(ss[ans].e<ss[i].e)cnt++;
			if(ss[ans].d<ss[i].d)cnt++;
			if(ss[ans].c<ss[i].c)cnt++;
			if(ss[ans].b<ss[i].b)cnt++;
			if(ss[ans].a<ss[i].a)cnt++;
			if(cnt<3)ans=i;//更新可能的冠军 
		}
		for(int i=1; i<ans; i++) {
			int cnt=0;
			if(ss[ans].a<ss[i].a)cnt++;
			if(ss[ans].b<ss[i].b)cnt++;
			if(ss[ans].c<ss[i].c)cnt++;
			if(ss[ans].d<ss[i].d)cnt++;
			if(ss[ans].e<ss[i].e)cnt++;
			if(cnt<3) {//如果可能的冠军不是冠军 
				ans=-1;
				break;
			}
		}
		if(flag)cout<<ans<<endl;
		else cout<<"-1"<<endl;
	}
	return 0;
}

C题:Maximize the Intersections
题意:给定一个有2n个点的圆,给定若干条连线,请问剩下节点两两相连,最多能连出最多交点
数据范围:多组输入t<100,n<100
样例解释
输入:
4
4 2
8 2
1 5
1 1
2 1
2 0
10 6
14 6
2 20
9 10
13 18
15 12
11 7
输出:
4
0
1
14
思路:在剩余点寻找可选的最远点相连。
分类:思维
通过代码:


D题:Array Differentiation
题意:给定n和数组ai,请问能否有数组长度为n的bi可以通过bj-bi来构造出ai,j<=i
数据范围:多组输入t<10,n<10,-1e5<ai<1e5
样例解释
5
5
4 -7 -1 5 10
1
0
3
1 10 100
4
-3 2 10 2
9
25 -171 250 174 152 242 100 -205 -258
输出:
YES
YES
NO
YES
YES
思路:用n个bi可以构造出n-1个ai,此时如果可以构造出重复ai,说明可以用n个bi构造出n个ai。
分类:思维
通过代码:

#include<bits/stdc++.h>
using namespace std;
int n;
map<int,int>mp;
int a[300005];
int dfs(int i, int x) {
	if(i==n) {
		mp[x]++;
		return 0;
	}
	dfs(i+1,x);
	dfs(i+1,x+a[i]);
	return 0;
}
int main() {
	int t;
	cin >> t;
	while(t --) {
		cin>>n;
		for(int i=0; i<n; i++)cin>>a[i];
		dfs(0,0);
		int flag=0;
		for(auto x:mp) {
			if(x.second>1) {
				flag=1;
			}
		}
		if(flag)cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
		mp.clear();
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值