Educational Codeforces Round 64 (Rated for Div. 2) A,B,C

比赛链接:

https://codeforces.com/contest/1156

A. Inscribed Figures

题意:

给出$n(2\leq n\leq 100)$个数,只含有1,2,3,分别代表圆,高与底相等的三角形,正方形

$a_{i+1}$在$a_{i}$的里面,$a_{i+1}$的面积尽可能的大

求不同的交点个数

分析:

注意正方形里面一个圆,再里面一个三角形的时候,有一个交点重合

ac代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
const int maxm=200000*2+10;
const int mod=1e9+7;
int num[maxn];
ll ans;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&num[i]);
    for(int i=2;i<=n;i++)
    {
        if(num[i]==1)
        {
            if(num[i-1]==2)ans+=3;
            if(num[i-1]==3)ans+=4;

        }
        if(num[i]==2)
        {
            if(num[i-1]==1)
            {
                if(i-2>=1&&num[i-2]==3)
                    ans+=2;
                else ans+=3;
            }
            if(num[i-1]==3)ans=1e18;
        }
        if(num[i]==3)
        {
            if(num[i-1]==1)ans+=4;
            if(num[i-1]==2)ans=1e18;
        }
    }
    if(ans>=1e17)
        cout<<"Infinite"<<endl;
    else
    {
        cout<<"Finite"<<endl;
        cout<<ans<<endl;
    }
    return 0;
}

  

B. Ugly Pairs

题意:

给出一个字符串$s(1\leq |s|\leq 100)$,重排它们,让每对相邻的字符在$ascii$表中不相邻

分析:

将$a,c,e,g...$放一个集合,将$b,d,f,h...$放另一个集合,看它们是否能连线在一起

ac代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=100+10;
const int maxm=200000*2+10;
const int mod=1e9+7;
int num[30];
char word[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        getchar();
        scanf("%s",word);
        int gkd=0;
        for(int i=0;word[i];i++)
            if((int)word[i]%2!=(int)word[0]%2)gkd=1;
        if(gkd==0)
        {
            printf("%s\n",word);
            continue;
        }
        memset(num,0,sizeof(num));
        for(int i=0; word[i]; i++)
            num[word[i]-'a']++;
        int a,b,fla=0;
        for( int i=0; i<26; i++)
            for(int j=0; j<26; j++)
                if(i%2==0&&j%2==1&&abs(i-j)!=1&&num[j]&&num[i])
                {
                    a=i,b=j;
                    fla=1;
                }
        if(fla==0)
        {
            printf("No answer\n");
            continue;
        }
        num[a]--;
        num[b]--;
        for(int i=0; i<26; i+=2)
            for(int j=0; j<num[i]; j++)
                printf("%c",(char)(i+'a'));
        printf("%c%c",(char)(a+'a'),(char)(b+'a'));
        for(int i=1; i<26; i+=2)
            for(int j=0; j<num[i]; j++)
                printf("%c",(char)(i+'a'));
        printf("\n");
    }
    return 0;
}

  

C. Match Points

题意:

给出n个数,组成最多的数对,满足$|a_i-a_j|\geq d$

分析:

这题一看就是贪心,但是,我的策略是,用最小的去匹配最小能匹配的,wa

例如:

4 2

1 3 4 7

最优解是$(1,4)(3,7)$

正确匹配方式是,用前面一部分匹配后面一部分

ac代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+10;
const int maxm=200000*2+10;
const int mod=1e9+7;
int n,d,num[maxn];
bool check(int x)
{
   int a=x,b=n;
   for(;a>=1;a--,b--)
    if(num[b]-num[a]<d)return 0;
   return 1;
}
int main()
{
    scanf("%d %d",&n,&d);
    for(int i=1;i<=n;i++)
        scanf("%d",&num[i]);
    sort(num+1,num+1+n);
    int st=0,en=n/2;
    while(st!=en)
    {
        int md=(st+en)/2;
        if(check(md+1))st=md+1;
        else en=md;
    }
    printf("%d\n",st);
    return 0;
}

总结:

第一题没考虑到交点重合的情况,wa了很多发,我应该模拟所有情况的

第二题比赛的时候没有思路

第三题贪心的策略错了,导致wa了还不知道原因

贪心是最难的算法Orz

猜你喜欢

转载自www.cnblogs.com/carcar/p/10801989.html