2021.01.28 Rating赛补题

B题:Knights of a Polygonal Table

题目大意:

给出n个士兵的力量值,以及金币数,以及士兵可以击杀其它士兵的最大数量,问最后,各个士兵可以得到的最大金币数。

思路:

该题首先就会想到把士兵按照力量排序,因为士兵只能击杀力量值小的士兵,这时问题就变为,遍历一遍士兵,在该士兵前面进行维护一个最大的至多m个金币值,最终该士兵的最大获取金币数,便是维护的最大值加上本身金币数。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
long long num[100100];
map<long long,long long>ma;
struct peo{
    ll w;
    ll v;

}p[100100];
 ll x[20];
bool cmp2(peo a,peo b){
    return a.w < b.w;
}
int main()
{
    ll n,m;
    cin >> n >> m;
    for(int i = 1;i <= n;i++){
        cin >> p[i].w;
        num[i] = p[i].w;
    }
    for(int i = 1;i <= n;i++){
        cin >> p[i].v;

    }
    if(m == 0){
        for(int i = 1;i <= n;i++){
            cout << p[i].v << " ";
        }
        cout << endl;
    }
    else{
        sort(p+1,p+1+n,cmp2);
        long long sum = 0;
        ll temp = 0;
        ma[p[1].w] = p[1].v;

        for(int i = 2;i <= n;i++){
            if(temp < m){
                sum += p[i-1].v;
                x[temp++] = p[i-1].v;
            }
            else if(p[i-1].v > x[0]){
                sum += p[i-1].v;
                sum -= x[0];
                x[0] = p[i-1].v;

            }
            sort(x,x+temp);
            ma[p[i].w]  =  p[i].v + sum;
        }
        for(int i = 1;i <= n;i++){
            cout << ma[num[i]]  << " " ;
        }
        cout << endl;
    }

    return 0;
}

C题:Two Squares

题目大意:

题目给出两个正方形的四点坐标,其中第一个是正方形一侧面与坐标轴平行,另外一正方形侧面与坐标轴成45度,问这两正方形是否相交。

思路:

首先通过题目可以看到给出的点范围为 [ -100,100 ],数据并不大,所以可以试着把两个正方形的说所有点分别放到两个集合中,然后比较两集合中点是否相同。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e5 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)

set< pair<int,int> > sa,sb;
int main()
{
    int xmax = -maxn,xmin = maxn,ymax = -maxn,ymin = maxn;
    for(int i = 0;i < 4;i++){
        int x,y;
        cin >> x >> y;
        xmax = max(xmax,x);
        xmin = min(xmin,x);
        ymax = max(ymax,y);
        ymin = min(ymin,y);
    }
    for(int i = xmin;i <= xmax;i++){
        for(int j = ymin;j <= ymax;j++){
            sa.insert(make_pair(i,j));
        }
    }
    xmax = -maxn,xmin = maxn,ymax = -maxn,ymin = maxn;
    for(int i = 0;i < 4;i++){
        int x,y;
        cin >> x >> y;
        xmax = max(xmax,x);
        xmin = min(xmin,x);
        ymax = max(ymax,y);
        ymin = min(ymin,y);
    }
    int mid = (xmax + xmin)/2;
    for(int i = 0;i <= xmax-mid;i++){
        for(int j = ymin;j <= ymax;j++){
            sb.insert(make_pair(mid+i,j));
            sb.insert(make_pair(mid-i,j));
        }
        ymin++;
        ymax--;
    }
    int sign = 1;
    for(auto i:sa){
        for(auto j:sb){
            if(i == j){
                sign = 0;
                break;
            }
        }
        if(!sign)
            break;
    }
    if(!sign)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;



    return 0;
}

 

上一篇:2021.3.3 Rating


下一篇:RatingBar基本使用