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;

}
View Code

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

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;

}
View Code
原文地址:https://www.cnblogs.com/a-specter/p/15082991.html