Codeforces Round #317 [AimFund Thanks-Round] (Div. 二)(A,B)

Codeforces Round #317 [AimFund Thanks-Round] (Div. 2)(A,B)

A题:
题目地址:Arrays
题意:有两个非递减序列的数组A,B,从A数组中选择k个数,B数组中选择m个数,是否存在A数组选择的k个数小于任意B数组选择的m个数。
思路:选择A数组最后一个数和B数组的第nb-m个数相比较即可。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
const int Maxn=1e5+10;
int a[Maxn];
int b[Maxn];
int main()
{

    int n,m;
    while(~scanf("%d%d",&n,&m)) {
        int k,t;
        scanf("%d%d",&k,&t);
        for(int i=0; i<n; i++)
            scanf("%d",&a[i]);
        for(int i=0; i<m; i++)
            scanf("%d",&b[i]);
        if(a[k-1] < b[m-t])
            printf("YES\n");
        else printf("NO\n");

    }
    return 0;
}

B题:
题目地址:Order Book
题意:对n个参与者,对卖家(卖给咱的)按降序输出小单价的s组结果;对买家(买咱的)按降序输出大单价的s组结果。相同单价的合并,先输出S,后输出B,若分别少于s组,则尽可能多输出。
思路:看懂题意,直接模拟。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
const int Maxn=1e5+10;
int n,m;
int b[Maxn];
int s[Maxn];
int main()
{
    char str[20];
    int x,y;
    while(~scanf("%d%d",&n,&m)) {
        memset(b,0,sizeof(b));
        memset(s,0,sizeof(s));
        for(int i=0; i<n; i++) {
            scanf("%s %d %d",str,&x,&y);
            if(strcmp(str,"B")==0)
                b[x]+=y;
            else
                s[x]+=y;
        }
        int t=0,p=0;
        for(int i=0; i<=Maxn; i++) {
            if(t<m&&s[i]) {
                t++;
                p=i;
            } else if(t>=m)
                break;
        }
        for(int i=p; i>=0; i--) {
            if(s[i]) {
                printf("S %d %d\n",i,s[i]);
                t++;
            }
        }
        t=0;
        for(int i=Maxn; i>=0; i--) {
            if(t<m && b[i]) {
                printf("B %d %d\n",i,b[i]);
                t++;
            } else if(t>=m)
                break;
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。