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; }