Codeforces Round #706 A~E

A. Split it!

题意对于长度为n的字符串,从开头寻找长度为k的回文,同时中间应当还有字符串

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define mem(x) (memset(x,0,sizeof(x)))
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}());
const ll mod=1000000007;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}



// head
 int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int __;
    cin>>__;
    while(__--)
    {
        int n,s;
        cin>>n>>s;
        string a;
        cin>>a;
        if(s==0)
        {
            cout<<"YES"<<endl;
            continue;
        }
        if((n-1)/2>=s)
        {
            int flag=0;
            int cnt=0;
            if(n%2==0)
            rep(i,0,n/2)
            {
                if(cnt==s)
                    break;
                if(a[i]!=a[n-i-1])
                    flag=1;
                else
                    cnt++;
            }
            if(n%2!=0)
            {
                rep(i,0,n/2)
                {
                    if(cnt==s)
                        break;
                if(a[i]!=a[n-1-i]){
                    flag=1;
                    //cout<<i;
                }
                else
                    cnt++;
                }
            }
            if(flag)
                cout<<"NO"<<endl;
            else
                cout<<"YES"<<endl;
        }
        else
            cout<<"NO"<<endl;
    }

}

B. Max and Mex

题意:对于该题求数列的mex+max

思路:对于题目中mex如果小于max那么(mex+max)/2取上界使mex发生变化只有mex=1+max时成立,因此求mex的值与max的关系,如果成立那么ans为原始序列不重复数加k操作,否则就考虑那次相加是否改变了序列一次。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define mem(x) (memset(x,0,sizeof(x)))
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}());
const ll mod=1000000007;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}



// head
int a[100005];
 int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int __;
    cin>>__;
    while(__--)
    {
        int n,k;
        cin>>n>>k;
        map<int,int>s;
        int me=0,ma=0;
        rep(i,0,n)
        {
            cin>>a[i];
            s[a[i]]=1;
        }
        sort(a,a+n);
        ma=a[n-1];
        int cnt=0,flag=0;
        if(a[0]!=0){
            me=0;flag=1;
        }
        cnt=1;
        rep(i,1,n)
        {
            if(a[i]==a[i-1])
            ;
            else
                cnt++;
            if(flag==0)
            {
            if(a[i]==me+1)
                me=a[i];
            else if(a[i]>me+1)
            {
                me=me+1;
                flag=1;
            }
            else if(a[i]<me+1)
                ;
            }
        }
        if(flag==0)
            me++;
        if(me==ma+1)
            cout<<cnt+k<<endl;
        else
        {
            if(s[(me+ma+1)/2]==0&&k)
                cout<<cnt+1<<endl;
            else
                cout<<cnt<<endl;
        }
    }

}
View Code

C. Diamond Miner

题意:求x轴与y轴上点两两配对时最小的∑√((y)2+(x)2) 的值

思路:易得√36+√36>√60+√6,因此对于所有的xy取绝对值排序计算即可

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define mem(x) (memset(x,0,sizeof(x)))
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}());
const ll mod=1000000007;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}


double mysqrt(double x)
{
    if (x == 1 || x == 0)
        return x;
    double temp = x / 2;
    while (1)
    {
        double a = temp;
        temp = (temp + x / temp) / 2;
        if (fabs(a - temp) < 0.000001)
        {
            return temp;
        }
    }
}
double a[100005],b[100005];
// head
 int main()
{
//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int __;
    cin>>__;
    while(__--)
    {
        int n;
        cin>>n;
        int cnt1=0,cnt2=0;
        rep(i,0,n*2)
        {
            double x,y;
            scanf("%lf %lf",&x,&y);
            if(x==0)
                a[cnt1++]=abs(y);
            else
                b[cnt2++]=abs(x);
        }
        sort(a,a+n);
        sort(b,b+n);
       // rep(i,0,n)
        //cout<<a[i];
        double ans=0;
        rep(i,0,n)
        {
            ans+= mysqrt(a[i]*a[i]+b[i]*b[i]);
        }
        printf("%.12lf\n",ans);
    }

}
View Code

D. Let's Go Hiking

题意对于Q与D,Q先走,Q的下一步的权值x必须比上一步的权值小,D则相反,同时Q先走,问Q先走有多少个必胜位置。

思路:对于该题需要分部考虑,首先,如果Q不在波峰,如果Q选择Qi-1>Qi>QI+1,那么对于D只要选在Qi+1那么Q就不能进行,因此需要选择波峰。

对于有一边是偶数时D选择最低处若长度为s走到交汇处时下一步是Q先走,此时无路可走,如果选择另一边,只要在一边有偶数时,选两边较短的偶数长度对应到另一边则同边走S/2后Q输,选相反边走S后任然是Q输

对于两边都是奇数时如果奇数不相等,选择较长边的s-1,仍然回到了上面的情况,因此获胜的唯一可能就是两边为奇数相等且为最大值。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define mem(x) (memset(x,0,sizeof(x)))
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}());
const ll mod=1000000007;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}

int a[100005];
int v[100005];

// head
 int main()
{
//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int __=1;
  //  cin>>__;
    while(__--)
    {
        int n;
        cin>>n;
        rep(i,0,n)
        {
            scanf("%d",&a[i]);
        }
        rep(i,1,n)
        {
            v[i]=(a[i]>a[i-1]);
        }
        int mx=0, cnt=0;
        for(int s=1,e=1;s<n;s=e=e)
        {
            int o=v[s];
            while(o==v[e]&&e<n)
                e++;
            int len=e-s+1;
            if(len>mx)
            {
                mx=len;
                cnt=1;
            }
            else if(len==mx)
                cnt++;
        }
       // cout<<cnt<<"%%"<<mx<<endl;
        if(cnt!=2||mx%2==0){
            cout<<"0"<<endl;
            continue;
        }
        int flag=0;
        for(int i=2;i<n&&!flag;i++)
        {
            if(v[i]!=v[i-1])
            {
                int l=i-1,r=i;
                //cout<<l<<r<<endl;
                while(v[l]&&l>0)l--;
                while(!v[r]&&r<n)r++;
                //cout<<l<<r;
                l=i-1-l+1;r=r-i+1;
                //cout<<l<<r<<endl;
                if(l==r&&l==mx)
                    flag=1;
            }
        }
        if(flag)
            cout<<"1"<<endl;
        else
            cout<<"0"<<endl;

    }


}
View Code

 

E. Garden of the Sun

题意:对于图,有。与X,在初始图中任意两X之间是点边都不相连的,求将图上所有的X链接且两点间只有一条简单通路。

思路:一开始思路出现问题认为只要对于每一个3边将两边填满中间边只有一个点即可,发现对于许多条件并不通用,根据题意中的X初始是相连边点无相连,因此可以只用填满其中一边另外两边选择一个点连接一条通路即可连接到下一个填满边。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define mem(x) (memset(x,0,sizeof(x)))
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}());
const ll mod=1000000007;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}



// head
 int main()
{
//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int __;
    cin>>__;
    while(__--)
    {
        int n,m;
        cin>>n>>m;
        char a[505][505];
        rep(i,1,n+1)
        {
            scanf("%s",a[i]+1);
        }
        for(int i = 1 + (m % 3 == 0) ; i <= m ; )
        {
            for(int j = 1 ; j <= n ; ++j)
                a[j][i] = 'X';
                i += 3;
            if(i > m)
                break;
            int p = 1;
            if(n == 1 || (a[2][i - 1] != 'X' && a[2][i - 2] != 'X'))
                p = 1;
            else
                p = 2;
            a[p][i - 1] = a[p][i - 2] = 'X';
    }

        rep(i,1,n+1)
        {
            rep(j,1,m+1)
            {
                printf("%c",a[i][j]);
            }
            printf("\n");
        }
    }

}
View Code

 

posted @ 2021-03-12 12:22  大抵一个菜鸡而已  阅读(53)  评论(0编辑  收藏  举报