2021.07.23暑假集训(2019 East Central North America思维+

F-F Musical Chairs_2019 East Central North America (nowcoder.com)

1)一个是分离两个坐标的关系,原数组中的坐标已经没有用了,只是需要那个change到底是多少;

2)是需要change和那个现在新数组的

3)期间size也是变化的

2021.07.23暑假集训(2019 East Central North America思维+
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;
const int maxx=1e5+10;
long long int a[maxx];
int main(){
    int n;
    vector<pair<int,int>> s;
    pair<int,int> num[maxx];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&num[i].first);
        num[i].second=i+1;
        s.push_back(num[i]);
    }
    int c=0;//一个是分离两个坐标的关系,原数组中的坐标已经没有用了,只是需要那个change到底是多少
    //是需要change和那个现在新数组的
    //期间size也是变化的
    while(s.size()>1){
        int j=c;//现在坐标位置
        c=(s[j].second+j-1)%s.size();//主要是j和s[j].second之间的关系
        s.erase(s.begin()+c);
        c%=s.size();//现在size变了,相应的值也变化到了前一个位置
    }
    printf("%d\n",s[0].second);
}
View Code

 2.map 套set  不连续下标的二维数组

3.A-A Retribution!_2019 East Central North America (nowcoder.com)

1)主要是这种映射贪心让数组a的值对应数组b中一一组合,让其最小,应该是length|a|*length|b|总共这么多可能,然后去里面找,不是a1找到最小,然后再排除,用a2找最小,可能a2先找最小使得最后最小,所以应该是混合在一起,然后标记下来,再去找最小

2021.07.23暑假集训(2019 East Central North America思维+
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;
const int maxx=1e6+10;
int x[maxx][3];
int y[maxx][3];
struct people{
    double length;
    int i1,i2;
}s1[maxx],s2[maxx];
int sign1[maxx]={0};
int sp1[maxx]={0};
int sp2[maxx]={0};
int sign2[maxx]={0};
double l(int x1,int y1,int x2,int y2){
    int l1=x1-x2,l2=y1-y2;
    return sqrt(l1*l1+l2*l2);
}
bool cmp(people a,people b){
    if(a.length==b.length){
        return a.i1<b.i1;
    }
    return a.length<b.length;
}
int main(){
    int n,m,p;
    scanf("%d %d %d",&n,&m,&p);
    for(int i=0;i<n;i++){
        scanf("%d %d",&x[i][0],&y[i][0]);
    }
    for(int i=0;i<m;i++){
        scanf("%d %d",&x[i][1],&y[i][1]);
    }
    for(int i=0;i<p;i++){
        scanf("%d %d",&x[i][2],&y[i][2]);
    }
    int s11=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            double le=l(x[i][0],y[i][0],x[j][1],y[j][1]);
            s1[s11].i1=i;
            s1[s11].i2=j;
            s1[s11++].length=le;
        }
    }

    int s22=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<p;j++){
            double le=l(x[i][0],y[i][0],x[j][2],y[j][2]);
            s2[s22].i1=i;
            s2[s22].i2=j;
            s2[s22++].length=le;
        }
    }
    sort(s1,s1+s11,cmp);
    sort(s2,s2+s22,cmp);
    double sum=0;
    for(int i=0;i<s11;i++){
        if(sign1[s1[i].i1]==0&&sp1[s1[i].i2]==0){
            sum+=s1[i].length;
            sign1[s1[i].i1]++;
            sp1[s1[i].i2]++;
        }
    }
    for(int i=0;i<s22;i++){
        if(sign2[s2[i].i1]==0&&sp2[s2[i].i2]==0){
            sum+=s2[i].length;
            sign2[s2[i].i1]++;
            sp2[s2[i].i2]++;
        }
    }
    printf("%f\n",sum);

}
View Code

 

不知道现在补题觉得这题真的不难,就是有一些细节的问题,不知道为什么昨天就只是做出了一个题来,简直菜死了,但是官方给出的有些题解,就连最基础的二分都写错了,不知道怎么搞得,感觉这套题题意也是模模糊糊的,一言难尽,求求题目质量好点吧,浪费青春 ……

上一篇:选择子序列


下一篇:电路城有一些云台的PCB