Educational Codeforces Round 64 (Rated for Div. 2)
Posted emerson027
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 64 (Rated for Div. 2)相关的知识,希望对你有一定的参考价值。
题目链接:https://codeforces.com/contests/1156
A. Inscribed Figures
题目大意:假设1代表圆形,2代表正三角形,3代表正方形,那么如例一所示2 1 3就代表正三角形内接圆形,同时内接圆的内部再内接正方形。那么现在所需要求的就是通过不断内接图形最终有多少个交点,如果在这个过程中内接的图形与之有边重合则 Infinite
解题思路:分别画出1 2 3 、1 3 2、2 1 3、2 3 1、3 1 2、3 2 1,就可以得出规律如下
- 1中内接2或者2中内接1,则有3个交点
- 1中内接3或者3中内切1,则有4个交点
- 2和3相连一定存在边重合的现象,所以2和3之间一定要有1,否则 Infinite
- 特殊情况 3 1 2,存在重合点,需要特别判断
#include<cstdio> #include<iostream> using namespace std; // zhicheng // May,2,2019 int main() { int n,ans=0,a[105]; scanf("%d",&n); for(int i=0;i<n;++i) { scanf("%d",&a[i]); if(i==0||ans==-1) continue; if(a[i]*a[i-1]==6) ans=-1; else if(a[i]*a[i-1]==2) ans+=3; else if(a[i]*a[i-1]==3) ans+=4; if(i>=2&&a[i]==2&&a[i-2]==3) --ans; } ans==-1?printf("Infinite\n"):printf("Finite\n%d\n",ans); return 0; }
B. Ugly Pairs
题目大意:给定由小写字母组成的字符串,现在规定按照26字母表中相邻的字母不能在字符串中的位置也相邻,需要对字符串中各个字符的位置重新,问重新排列后是否可以达到题目要求,如果可以的话,输出排列后的结果(结果不唯一),否则的话,输出“No answer“
解题思路:把字符串各个字母出现的次数存进num[26]数组中,然后根据num[26]将26字母表中偶数位的字母存进字符串s1中,再将26字母表中奇数位的字母存进字符串s2中,最后的组合有s1+s2或者s2+s1,而这样的组合一定满足题目要求
#include<cstdio> #include<iostream> #include<string> #include<cstring> using namespace std; // zhicheng // May,2,2019 int main() { int _; char s[105],num[26]; for(scanf("%d",&_);_;--_) { memset(num,0,sizeof(num)); scanf("%s",s); for(int i=0;s[i];++i) ++num[s[i]-‘a‘]; string s1,s2; for(int i=0;i<26;i+=2) while(num[i]--) s1+=‘a‘+i; for(int i=1;i<26;i+=2) while(num[i]--) s2+=‘a‘+i; if(abs(s1.back()-s2.front())>1) cout<<s1<<s2<<"\n"; else if(abs(s1.front()-s2.back())>1) cout<<s2<<s1<<"\n"; else cout<<"No answer\n"; } return 0; }
C. Match Points
题目大意:给定n个数,要求在这n个数中找到两两匹配的数,匹配的条件为
-
- 已经参与匹配的数不可再次参与匹配
- 两个匹配的数字差的绝对值不小于z
问由n个数组成的序列中,最多可以组成多少对这样的匹配数
解题思路:先从小到大排序,再用尺选法进行匹配,时间复杂度为O(nlogn)
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; // zhicheng // May,2,2019 const int maxn=2*1e5+10; int a[maxn]; int main() { int n,z,ans=0;scanf("%d %d",&n,&z); for(int i=0;i<n;++i) scanf("%d",&a[i]); sort(a,a+n); int p=n/2; for(int i=0;i<n/2;++i) { for(;p<n;++p) { if(a[p]-a[i]>=z){++ans;++p;break;} } } printf("%d\n",ans); return 0; }
D. 0-1-Tree
E. Special Segments of Permutation
F. Card Bag
G. Optimizer
以上是关于Educational Codeforces Round 64 (Rated for Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 7 A
Educational Codeforces Round 7
Educational Codeforces Round 90
Educational Codeforces Round 33