F-F Musical Chairs_2019 East Central North America (nowcoder.com)
1)一个是分离两个坐标的关系,原数组中的坐标已经没有用了,只是需要那个change到底是多少;
2)是需要change和那个现在新数组的
3)期间size也是变化的
#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先找最小使得最后最小,所以应该是混合在一起,然后标记下来,再去找最小
#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
不知道现在补题觉得这题真的不难,就是有一些细节的问题,不知道为什么昨天就只是做出了一个题来,简直菜死了,但是官方给出的有些题解,就连最基础的二分都写错了,不知道怎么搞得,感觉这套题题意也是模模糊糊的,一言难尽,求求题目质量好点吧,浪费青春 ……