Codeforces Round #387 (Div. 2)

A - Display Size

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

int main(){
    int n;
    while(scanf("%d", &n) !=EOF){
        for(int i = sqrt(n+0.5); i >= 1; i--){
            if(n%i==0){
                printf("%d %d\n", min(n/i, i), max(n/i,i));
                break;
            }
        }
    }
    return 0;
}

B - Mammoth’s Genome Decoding

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

const int maxn = 1000;

char s[maxn];

int main(){
    int n;
    scanf("%d", &n);
    scanf("%s", s);
    int a = 0, b = 0, c = 0, d = 0;
    if(n%4){
        printf("===\n");
        return 0;
    }
    for(int i = 0; i < strlen(s) ; i++){
        if(s[i] == 'A') a++;
        else if(s[i] == 'G') b++;
        else if(s[i] == 'C') c++;
        else if(s[i] == 'T') d++;
    }
    n /= 4;
    if(a > n || b > n || c > n || d > n){
        printf("===\n");
        return 0;
    }
    else{
        a = n-a;
        b = n-b;
        c = n-c;
        d = n-d;
        for(int i = 0; i < strlen(s); i++){
            if(s[i] == '?'){
                if(a){
                    printf("A");
                    a--;
                }
                else if(b){
                    printf("G");
                    b--;
                }
                else if(c){
                    printf("C");
                    c--;
                }
                else if(d){
                    printf("T");
                    d--;
                }
            }
            else printf("%c", s[i]);
        }
    }
    return 0;
}

C - Servers

强行用优先队列和STL给写出来的

#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e6+10000;

vector <int> vec[maxn];
priority_queue <int, vector<int>, greater<int> > pq;

struct Node{
    int t, k, d;
    bool operator < (const Node temp)const{
        return t < temp.t;
    }
}a[maxn];

void init(){
    while(!pq.empty()) pq.pop();
    for(int i = 0; i < maxn; i++) vec[i].clear();
}

int main(){
    int n, q;
    while(scanf("%d%d", &n, &q) != EOF){
        init();
        for(int i = 1; i <= n; i++) pq.push(i);
        for(int i = 0; i < q; i++) scanf("%d%d%d", &a[i].t, &a[i].k, &a[i].d);
        sort(a, a+q);
        int j = 0;
        for(int i = 1; i <= 1000000; i++){
            for(int k = 0; k < vec[i].size(); k++)
                pq.push(vec[i][k]);
            if(i == a[j].t){
                if(pq.size() >= a[j].k){
                    int sum = 0;
                    while(a[j].k){
                        sum += pq.top();
                        vec[a[j].t+a[j].d].push_back(pq.top());
                        pq.pop();
                        a[j].k--;
                    }
                    printf("%d\n", sum);
                }
                else printf("-1\n");
                j++;
                if(j >= q) break;
            }
        }
    }
    return 0;
}

D - Winter Is Coming

算出每个间距,然后贪心,注意细节即可。

#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 2e5+100;
int a[maxn];
vector <int> vec;

int main(){
    int n, k;
    while(scanf("%d%d", &n, &k) != EOF){
        vec.clear();
        int sum = 0;
        int change = 0;
        int form = -1;
        for(int i = 0; i < n; i++){
            scanf("%d", &a[i]);
            if(a[i] < 0){
                sum++;
                if(form >= 0) vec.push_back(i - form);
                form = i;
            }
            if(i == 0){
                if(a[i] < 0) change++;
            }
            else{
                if((a[i-1]>=0&&a[i]<0)||(a[i-1]<0&&a[i]>=0)) change++;
            }
        }
        if(sum > k){
            printf("-1\n");
            continue;
        }
        int left = k-sum;
        sort(vec.begin(), vec.end());
        for(int i = 0; i < vec.size(); i++){
                if(vec[i] == 1) continue;
                else{
                    if(left >= vec[i] - 1){
                        change -= 2;
                        left -= vec[i] - 1;
                    }
                }
        }
        if(n - form != 1 && left >= n-form-1) change--;
        if(change <= 0) printf("0\n");
        else printf("%d\n", change);
    }
    return 0;
}

E - Comments

自己写了半天一直不停的runtime error,表示快疯了,其实就是一直往下,然后处理到为0的时候再往上推,如果上一步继续为0那么继续往上推,直到停止。

#include<bits/stdc++.h>
using namespace std;
#define MN 1000000
string s,ans[MN+5];
int f[MN+5];
int main()
{
    int i,l=1,mx=1;
    cin>>s;f[0]=0x7fffffff;
    for(i=0;i<s.size();++i)
    {
        while(!f[l-1]--)--l;if(l>mx)mx=l;
        for(;s[i]!=',';++i)ans[l]+=s[i];
        ans[l]+=' ';f[l]=0;
        for(++i;i<s.size()&&s[i]!=',';++i)f[l]=f[l]*10+s[i]-'0';
        ++l;
    }
    cout<<mx<<endl;
    for(i=1;i<=mx;++i)cout<<ans[i]<<endl;

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值