(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦
(原题目描述在最下面)
B. Knights of a Polygonal Table
n个骑士,每人有自己的能力值和金币值。每个人可以击败k个能力值小于自己的人并且获取他们的金币。
问每个骑士最多获得多少金币。
思路:
把每个骑士按能力值从小到大排序,因为每个人只能击败能力值小于自己的人。这样排完序后,你只需要维护一个长度为k的权值最大k个的序列。
AC代码:
#include <bits/stdc++.h>
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
const int N = 1e5+5;
const int INF = 0x3f3f3f3f;
int n,k;
struct lp{
int id,val,num;
}cw[N];
bool cmp(lp &a,lp &b){
if(a.val!=b.val)return a.val<b.val;
return a.id<b.id;
}
vector<int>num;
LL Ans[N];
int main(){
iis;
while(cin>>n>>k){
k=min(n-1,k);
for(int i=0;i<n;++i){
cin>>cw[i].val;
cw[i].id=i;
}
for(int i=0;i<n;++i){
cin>>cw[i].num;
}
sort(cw,cw+n,cmp);
num.clear();
int tot=0;
for(int i=0;i<n;++i){
LL sum=0;
if(i==0){
Ans[cw[i].id]=cw[i].num;
num.push_back(cw[i].num);
tot++;
}else if(i<=k){
num.push_back(cw[i].num);
tot++;
for(int i=0;i<tot;++i){
sum+=num[i];
}
Ans[cw[i].id]=sum;
}else{
sort(num.begin(),num.end());
for(int i=1;i<=k;++i){
sum+=num[i];
//printf("**%d\n",num[i] );
}
sum+=cw[i].num;
//printf("*%d\n",num.size() );
if(cw[i].num>num[0]){
num.erase(num.begin());
num.push_back(cw[i].num);
}
//printf("*%d\n",num.size() );
Ans[cw[i].id]=sum;
}
}
for(int i=0;i<n;++i){
cout<<Ans[i]<<"\n";
}
}
return 0;
}
C. Two Squares
给你两个正方形,一个正方形每条边和坐标轴平行,一个正方形每条边和坐标轴夹角为45°。正方形按顺时针或逆时针顺序给出。问两个正方形是否相交。有一个交点也算相交。
思路:
数据范围只有-100到100,考虑暴力。
把第一个正方形区域染色为1.遍历第二个正方形,如果有点被染成1则有交点。
AC代码:
#include <bits/stdc++.h>
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
const int N = 1e5+5;
const int INF = 0x3f3f3f3f;
int n,k;
int ar[10],br[10],cr[10];
int mp[405][405];
struct lp{
int x,y;
friend bool operator <(lp &a, lp &b){
if(a.x!=b.x)return a.x<b.x;
return a.y<b.y;
}
}cw[10];
bool is(){
int t=1,f=1;
if(ar[0]>ar[4])t=-1;
if(ar[1]>ar[5])f=-1;
for(int i=0;i<4;++i){
cw[i].x=ar[i*2];cw[i].y=ar[i*2+1];
}
sort(cw,cw+4);
for(int i=cw[0].x;i<=cw[3].x;++i){
for(int j=cw[0].y;j<=cw[3].y;++j){
mp[i][j]=1;
}
}
for(int i=0;i<4;++i){
cw[i].x=br[i*2];cw[i].y=br[i*2+1];
if(mp[br[i*2]][br[i*2+1]]){
return 1;
}
}
sort(cw,cw+4);
for(int i=cw[0].x,g=1;i<=cw[1].x;++i,++g){
for(int j=cw[0].y,h=0;h<g;++j,++h){
if(mp[i][j])return 1;
}
for(int j=cw[0].y,h=0;h<g;--j,++h){
if(mp[i][j])return 1;
}
}
for(int i=cw[3].x,g=1;i>=cw[1].x;--i,++g){
for(int j=cw[0].y,h=0;h<g;++j,++h){
if(mp[i][j])return 1;
}
for(int j=cw[0].y,h=0;h<g;--j,++h){
if(mp[i][j])return 1;
}
}
return 0;
}
int main(){
iis;
for(int i=0;i<8;++i){
cin>>ar[i];
ar[i]+=105;
}
for(int i=0;i<8;++i){
cin>>br[i];
br[i]+=105;
}
if(is())printf("YES\n");
else printf("NO\n");
return 0;
}
题目描述: