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