coderforce #677(div3)

A. Boring Apartments

B. Yet Another Bookshelf

题意:就是你将所有的1移动到一起所需要的步数

思路:将所有的1放到一起看两个之间的距离加起来就可以

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+50;
int t,a[maxn];
int main()
{
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        vector<int>v;
        for(int i=0;i<n;++i)
        {
            cin>>a[i];
            if(a[i]==1) v.push_back(i);
        }
        int sum=0;
        for(int i=1;i<v.size();++i)
        {
            sum+=v[i]-v[i-1]-1;
        }
        cout<<sum<<endl;
    }
    return 0;
}
View Code

 C. Dominant Piranha

题意:挑选一个数,如果比左边大可以吃掉左边,加1,同理右边。找到一个数能按照这个操作把所有的都吃掉

思路:找到一组数里面最大的哪一个,看他的左边和右边是否比他小,如果可以那么就记录下这个数据,最后再排序将第一个和maxx比较

如果相同,也是不可以的,输出pos就可以了

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+50;
int t,n,a[maxn];
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        int maxx=0,pos=-1;
        for(int i=1;i<=n;++i)
        {
            cin>>a[i];
        }
        for(int i=1;i<=n;++i)
        {
            if(a[i]>=maxx) 
            {
                maxx=a[i];
                if(i<=n-1&&a[i]>a[i+1]) maxx=a[i],pos=i;
                if(i>=2&&a[i]>a[i-1]) maxx=a[i],pos=i;
            }
        }
        sort(a+1,a+n+1);
        //cout<<maxx<<endl;
        if(a[1]==maxx)
        {
            cout<<-1<<endl;
        }
        else cout<<pos<<endl;
    }
    return 0;
}
View Code

D. Districts Connection

题意:构造一个连通图,将所有的边连接起来,但是边链接的两个点的值是不能相同的,问是否能构成图

思路:将最有一个与前面不相等的构造,如果有和最大的相等的数值,那么就用第一个去和他构造。如果所有的数都是相等的也是不可以的

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+50;
int t,n,a[maxn];
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        int maxx=0,pos=-1;
        for(int i=1;i<=n;++i)
        {
            cin>>a[i];
        }
        for(int i=1;i<=n;++i)
        {
            if(a[i]>=maxx) 
            {
                maxx=a[i];
                if(i<=n-1&&a[i]>a[i+1]) maxx=a[i],pos=i;
                if(i>=2&&a[i]>a[i-1]) maxx=a[i],pos=i;
            }
        }
        sort(a+1,a+n+1);
        //cout<<maxx<<endl;
        if(a[1]==maxx)
        {
            cout<<-1<<endl;
        }
        else cout<<pos<<endl;
    }
    return 0;
}
View Code

E. Two Round Dances

题意:将所有的人分为两组,然后围城一个圈跳舞

思路:刚开始题目看错了,所以导致就wa了很多次。将n个人分成两组跳舞的次数是C(n,n/2)/2,然后围成一圈的跳舞的次数为(n/2-1)!所以将两个相乘就可以得到答案了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
    ll n;
    cin>>n;
    ll c=1;
    for(ll i=n/2+1;i<=n;++i)
    {
        c*=i;
    }
    for(ll i=2;i<=n/2;++i) c/=i;
    c/=2;
    ll fac=1;
    for(int i=1;i<n/2;++i) fac*=i;
    cout<<c*fac*fac<<endl;
    return 0;
}
View Code

F. Zero Remainder Sum(待补)

题意:给你个n*m的方阵,让你每一行选择两个数,使得他们的和能够整除m,问这个和最大是多少

思路:正解是个dp题目,然后我没有看懂,我看到有个人用的记忆化搜索,因为数据范围还是很小的,用记忆化搜索也是能做的

 

posted @ 2020-10-31 08:34  passawayy  阅读(105)  评论(0)    收藏  举报