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

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

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

D. 0-1-Tree

E. Special Segments of Permutation

F. Card Bag

G. Optimizer

猜你喜欢

转载自www.cnblogs.com/emerson027/p/10801458.html