CodeForces 1385总结

A.Three Pairwise Maximums
大意:给出三个数x,y,z,其中x=max(a,b),y=max(a,c),z=max(b,c),需要找出相应的a,b,c,使其成立。
思路:如果能找出合题意的答案,则给出的三个数中两个较大的数一定相等(数字逻辑,想想就能转过弯来),然后输出那个较大的数,输出给出的较小的数,再输出一个1即可。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll t,a[3],temp,n,i,j,k,x,y,z,ans,cnt,sum,Max,Min,ji,ou;
int main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
        cin>>a[0]>>a[1]>>a[2];
        sort(a,a+3);
        if(a[2]!=a[1])
        {
            cout<<"NO"<<endl;
        }
        else
        {
            cout<<"YES"<<endl;
            cout<<a[0]<<" "<<a[2]<<" "<<1<<endl;
        }
    }
    return 0;
}

B. Restore the Permutation by Merger
大意:给出一个数列,用与这个数列相同的数列按原顺序插回原数列,现给出你插完后的数列,问原数列是怎样的
思路:直接判断该数字是第几次出现即可,奇数次出现就输出该数,偶数次出现就忽略即可。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll t,a[55],temp,n,i,j,k,x,y,z,ans,cnt,sum,Max,Min,ji,ou,s;
int main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
        memset(a,0,sizeof a);
        cin>>n;
        for(i=1;i<=2*n;i++)
        {
            cin>>s;
            a[s]++;
            if(a[s]%2==1)
                cout<<s<<" ";
        }
        cout<<endl;
    }
    return 0;
}

C .Make It Good
大意:给出一个数列,让你从此数列的首部连续去除几个数字,使之变成好数组(好数组的条件是从其首或尾取数字,使其取出的数字呈不下降趋势)问最少需要去除几个数字。
思路:其实好数组就是一个先升后降的数组,直接看代码

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=200005;
typedef long long ll;
ll t,a[maxn],dp[maxn][5],temp,n,i,j,k,x,y,z,ans,cnt,sum,Max,Min,ji,ou,s,l;
int main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
        cin>>n;
        Max=0;
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(i=n;i>=1;i--)
        {
            if(a[i]<a[i+1]) break;
        }
        for(j=i;j>=1;j--)
        {
            if(a[j]>a[j+1]) break;
        }
        cout<<j<<endl;
    }
    return 0;
}

D.a-Good String
大意:关于a的好字符串的条件是前1/2或后半部分是a,另1/2是关于b的好字符串,在这另一部分中又有一半是b,另一半是关于c的好字符串,以此类推,问把给出的字符串改成好字符串需要改变几个字母。
当时想这个题想了好久,一直在想用循环解决,结果到最后也没解决,后来一想,多么显而易见的分治啊,二分法加上递归,轻轻松松就能做出来,唉。
E. Directing Edges
大意:给出一个图,有些图的箭头有向的有些是无向的。要求将无向的图标成有向的,并且让整个图不形成环。如果可以输出YES并给出其中一种方案。否则输出NO。
F. Removing Leaves
大意:有一棵树,共有n个节点。每次可以从同一个节点上去除k个叶子,输出最多可以去除几次。
G. Columns Swaps
大意:给你一个2*n的表格,你可以交换某一列的一二行的两个数,每列限交换一次(可不交换),需要找到所需的最少移动次数使这个表的第一行和第二行每个数字都仅有一个。
这次用一个小时多一点出了仨,感觉还行,不过本来D也应该出的,但是思维太窄就没出来,还是应该多想想曾经学过的算法,好好思考一下哪个能用得上。明天还有一场Div2,争取也能出仨,加油!

猜你喜欢

转载自blog.csdn.net/weixin_46434074/article/details/107420873
今日推荐