Codeforces Round #559 (Div. 2) (还差2题)

总结:这次写的太菜了,一个B题写了很久, 这种维护一个最小值在计算的题目,下次要反应快点; 

   C题是一个贪心,写的时候也是想了好久....

   D题这个范围.

题目链接:https://codeforces.com/contest/1159

A:

签到,算一个最开始有多少就行了,注意可以取到0,复杂度O(n)

#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
    int n; char c;
    int ca=0, cb=0, beg=0;
    cin>>n;
    while(n--)
    {
        cin>>c;
        if(c=='+') ca++;
        else if(c=='-')cb++;
        if(beg+ca-cb<0) beg++;
    }
    //printf("ca=%d\ncb=%d\nbeg=%d\n", ca , cb, beg);
    cout<<beg+ca-cb<<endl;
    return 0;
}
View Code

 

B:

给出公式,求k的范围,枚举当前的最小的a[i],求满足条件的k即可,这题反应太慢了...复杂度O(nlogn)

#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=1e6+5;
struct Node{
    int val;
    int cnt;
}a[MAXN];

bool cmp(Node x, Node y){
    return x.val<y.val;
}

int main()
{
    int ans=INF;
    int n; cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i].val;
        a[i].cnt=i;
    }
    sort(a, a+n, cmp);
    for(int i=1; i<=n; i++)
        ans=min(ans, a[i].val/max(a[i].cnt-1, n-a[i].cnt));
    cout<<ans<<endl;
    return 0;
}
View Code

 

C:

题意:给了n个boys对m个girls的 sweet 的min(n组),m个girls接受到n个boys的sweet的max(m组),求n个男生对m个女生的sweet的最小的和,不满足条件输出-1 ; 

题解:先判断是否满足条件,对n个男生的min排序,对m个女生的max排序,优先将大的max添加到大的min那一组,在求一个sum;复杂度O(nlogn)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; 

const int MAXN=2e6; 
int a[MAXN], b[MAXN], vis[MAXN], vismin[MAXN]; 

int main()
{
    //freopen("in.txt", "r", stdin); 
    int n, m; 
    cin>>n>>m; 
    for(int i=1; i<=n; i++)
        cin>>a[i]; 
    for(int i=1; i<=m; i++)
        cin>>b[i]; 
    
    long long sum=0; 
    for(int i=1; i<=n; i++)
        sum+=a[i]; 
    sum*=m; 
    sort(a+1, a+1+n); 
    sort(b+1, b+1+m); 
    memset(vismin, 0, sizeof(vismin));
    for(int i=1; i<=n; i++) vis[i]=m-1; 
    
    int ok=1;
    for(int i=m; i>=1; i--)
    {
        if(b[i]<a[n]){
            ok=0; break;
        }
    }
    
    if(ok==0)
        cout<<"-1"<<endl;
    else 
    {
        int A=n, B=m; 
        for(int B=m; B>=1; B--)
        {
            while(b[B]<a[A]) A--; 
            if(b[B]==a[A]) 
            {
                if(!vismin[A]) vismin[A]=1; 
                else if(vis[A]>0) vis[A]--;
                else if(a[A-1]==b[B]){
                    A--; vismin[A]=1; 
                } 
                else {
                    A--; vis[A]--; 
                }
                sum+=b[B]-a[A];
            }
            else 
            {
                if(vis[A]>0) vis[A]--; 
                else if(a[A-1]==b[B]){
                    A--; vismin[A]=1; 
                } 
                else {
                    A--; vis[A]--; 
                }
                sum+=b[B]-a[A];
            }
        }
        cout<<sum<<endl; 
    }
    return 0;
} 
View Code

 

D:

题意:给了n和k,n代表长度为n由0或者1组成的串,找出一个这样长度的串,且该串中最长的唯一子串的长度是k;重要条件:n,k的奇偶性相同 

题解:找规律题,

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

int main()
{
    int n, k; 
    cin >> n >> k; 
    int a=(n-k)/2+1;
    for(int i=1; i<=n; i++)
    {
        if(i%a==0) printf("1"); 
        else printf("0"); 
    }    
    return 0; 
} 
View Code

 

posted @ 2019-05-23 19:19  N_Yokel  阅读(208)  评论(0编辑  收藏  举报