2019 East Central North America
A Retribution!
题目给出n个人的位置,m,p个两种仓库的位置,给一个人分配两个不同的仓库
(参考大佬思路:先分配第一种仓库,对每个人到每个仓库的距离进行排序,安装排好的顺序分配,并检测这个人是否已经分配仓库,这个仓库是否已经被分配了,都没有则记录距离标记分配,在分配第二种仓库,输出总和
#include<bits/stdc++.h> using namespace std; const int maxn=1005; #define x first #define y second pair<double,double> j[maxn],t[maxn],f[maxn]; struct node{ int i,j; double d; }a1[maxn*maxn],a2[maxn*maxn]; int vj[maxn],vt[maxn],vf[maxn]; double dis(pair<double,double> a,pair<double,double> b){ return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); } bool cmp(node a,node b){ if(a.d==b.d){ return a.i<b.i; } return a.d<b.d; } int main(){ int n,m,p,cnt1=0,cnt2=0; cin>>n>>m>>p; for(int i=0;i<n;i++){ cin>>j[i].x>>j[i].y; } for(int i=0;i<m;i++){ cin>>t[i].x>>t[i].y; } for(int i=0;i<p;i++){ cin>>f[i].x>>f[i].y; } for(int i=0;i<n;i++){ for(int k=0;k<m;k++){ a1[cnt1].i=i; a1[cnt1].j=k; a1[cnt1].d=dis(j[i],t[k]); cnt1++; } } sort(a1,a1+cnt1,cmp); double sum=0; for(int i=0;i<cnt1;i++){ if(vj[a1[i].i]==0 && vt[a1[i].j]==0){ sum+=a1[i].d; vj[a1[i].i]=1; vt[a1[i].j]=1; } } for(int i=0;i<n;i++){ for(int k=0;k<p;k++){ a2[cnt2].i=i; a2[cnt2].j=k; a2[cnt2++].d=dis(j[i],f[k]); } } sort(a2,a2+cnt2,cmp); for(int i=0;i<cnt2;i++){ if(vj[a2[i].i]!=2 && vf[a2[i].j]==0){ sum+=a2[i].d; vj[a2[i].i]=2; vf[a2[i].j]=2; } } printf("%.7f",sum); return 0; }
F Musical Chairs
思路:根据题意模拟
#include<bits/stdc++.h> using namespace std; const int maxn=100005; long long a[maxn]; struct stu{ int m; int i; }; int main(){ int n,m,i=0,j; cin>>n; vector<stu> v; for(int i=0;i<n;i++){ cin>>m; stu sss; sss.m=m; sss.i=i+1; v.push_back(sss); } while(v.size()>1){ //cout<<i<<endl; j=i; i=(v.at(i).m-1)%v.size(); i=(i+j)%v.size(); //cout<<i<<" "<<v.at(i).m<<endl; v.erase(v.begin()+i); i=i%v.size(); } cout<<v.at(0).i<<endl; return 0; }
G Out of Sorts
思路:根据题意写二分,遍历判断有几个二分结果是对的
哦我这个笨蛋有个中间变量用了int炸了检测好几次还没发现
#include<bits/stdc++.h> using namespace std; const int maxn=1000005; long long b[maxn]; long long n,m,a,c,x0,cnt=0; bool pd(long long i) { long long l=1,r=n,mid; while(l<=r){ mid=(l+r)/2; if(mid==i){ return true; }else if(b[mid]>b[i] && i<mid){ r=mid-1; }else if(b[mid]<b[i] && i>mid){ l=mid+1; }else{ break; } } return false; } int main(){ cin>>n>>m>>a>>c>>x0; b[0]=x0; for(long long i=1;i<=n;i++){ b[i]=(a*b[i-1]+c)%m; //cout<<b[i]<<endl; } for(long long i=1;i<=n;i++){ if(pd(i)){ cnt++; } } cout<<cnt<<endl; return 0; }