Codeforces Round #674 (Div. 3)--划水

Codeforces Round #674 (Div. 3)

https://codeforces.com/contest/1426

A. Floor Number

思路

因为数据量小所以直接暴力枚举层数即可。

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 

const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=1e5+7;
const ll mod=1e9+7;    

int main(){ 
    IO;
    int t=1;
    cin>>t;
    while(t--){ 
        int n,x;
        cin>>n>>x;
        if(n==1||n==2){
            cout<<1<<endl;continue;
        }
        int k=1;
        while(1)
        {
            if(n>=(k-1)*x+3&&n<=k*x+2)break;
            k++;
        }
        cout<<k+1<<endl;
    }
    return 0;
}

B. Symmetric Matrix

思路

首先如果m是奇数则无法满足。
如果要构成对称矩阵只需要1个2×2的对称矩阵进行平铺即可

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 

const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=1e5+7;
const ll mod=1e9+7;    

int main(){ 
    IO;
    int t=1;
    cin>>t;
    while(t--){ 
        int n,m;
        cin>>n>>m;
        int x=0;
        for (int i = 0; i < n; ++i)
        {
            int a,b,c,d;
            cin>>a>>b>>c>>d;
            if(c==b)x++; 
        }
        if(m&1){
            cout<<"NO"<<endl;
            continue;
        }
        if(x)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

C. Increase and Copy

思路

要想在最小的时间内完成,肯定需要先将1增大到某个值然后进行复制。
设这个临界值为x,则答案为x-1+(n-x)/x,即为:x+n/x,当x=sqrt(n)时取得最小值,所以x=sqrt(n)。
注意运算的向上取整

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 

const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=1e5+7;
const ll mod=1e9+7;    

int main(){ 
    IO;
    int t=1;
    cin>>t;
    while(t--){ 
        int n;
        cin>>n;
        int ans=n-1;
        ll k=sqrt(1.0*(n+1));
        cout<<(k-1+(n-1)/k)<<endl;
    }
    return 0;
}

D. Non-zero Segments

思路

将每个片段求和,如果出现重复的值即为存在sum为0的序列,需要安插一个数字,因为数字可以是任意值,可以直接安插一个无穷大值。
求出需要安插数字的最小数量,考虑到某些片段会相互影响,比如:1、4、-2、-2、-1,次序列中片段4、-2、-2改变后整个序列也会改变,所以需要单独处理每个sum是0的片段,处理完一个后将影响清空接着处理下一个。

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 

const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=200007;
const ll mod=1e9+7;     

int main(){ 
    IO;
    int t=1;
    //cin>>t;
    while(t--){ 
        int n;
        cin>>n;
        map<ll,int>mp; 
        ll ans=0,sum=0;
        mp[sum]=1;
        for (int i = 1; i <= n; ++i)
        {
            cin>>a[i];
            sum+=a[i];
            if(mp[sum]){
                ans++;
                mp.clear();
                mp[0]=1;
                sum=a[i];
            }mp[sum]=1;
        }
        cout<<ans<<endl;
    }
    return 0;
}

E. Rock, Paper, Scissors

思路

考虑得分最小的情况,
Alice的石头和布全部用于和Bob的布进行比较,得分为Bob的出布的次数减去Alice出的石头和布的总和(与0比较取max),此时Bob出的布只能和Alice的剪刀匹配;
Alice的剪刀和石头全部用于和Bob的石头进行比较,得分为Bob的出石头的次数减去Alice出的石头和剪刀的总和(与0比较取max),此时Bob出的石头只能和Alice的布匹配;
Alice的剪刀和布全部用于和Bob的剪刀进行比较,得分为Bob的出剪刀的次数减去Alice出的剪刀和布的总和(与0比较取max),此时Bob出的剪刀只能和Alice的石头匹配。

得分最大的情况为Alice的石头和Bob的剪刀匹配,Alice的剪刀和Bob的布匹配,Alice的布和Bob的石头相匹配。

Code

#include<bits/stdc++.h>
#define IO  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std; 

const int inf=0x3f3f3f3f;
typedef long long ll; 
const int N=200007;
const ll mod=1e9+7;    

int main(){ 
    IO;
    int t=1;
    //cin>>t;
    while(t--){ 
        int n;
        cin>>n;
        int minn=0,maxn=0,a1,a2,a3,b1,b2,b3;
        cin>>a1>>a2>>a3>>b1>>b2>>b3;
        minn+=max(0,b3-a1-a3);
        minn+=max(0,b2-a2-a3);
        minn+=max(0,b1-a1-a2);

        maxn+=min(a1,b2)+min(a2,b3)+min(a3,b1);
        cout<<minn<<" "<<maxn<<endl;
    }
    return 0;
}
posted @ 2021-01-27 11:37  !^^!  阅读(81)  评论(0编辑  收藏  举报