座位调整

来源:互联网 发布:青木原森林 知乎 编辑:程序博客网 时间:2024/04/25 22:36
题目描述: 百度办公区里到处摆放着各种各样的零食。百度人力资源部的调研发现,员工如果可以在自己喜欢的美食旁边工作,工作效率会大大提高。因此,百度决定进行一次员工座位的大调整。 调整的方法如下: 1 . 首先将办公区按照各种零食的摆放分成 N 个不同的区域。(例如:可乐区,饼干区,牛奶区等等)。 2 . 每个员工对不同的零食区域有不同的喜好程度(喜好程度度的范围为 1 — 100 的整数, 喜好程度越大表示该员工越希望被调整到相应的零食区域)。 3 . 由于每个零食区域可以容纳的员工数量有限,人力资源部希望找到一个最优的调整方案令到总的喜好程度最大。 数据输入: 第一行包含两个整数 N , M ,( 1<=N , M<=300 )。分别表示 N 个区域和 M 个员工。 第二行是 N 个整数构成的数列 a ,其中 a[i] 表示第 i 个区域可以容纳的员工数, (1<=a[i]<=M , a[1]+a[2]+..+a[N]=M) 。 紧接着是一个 M*N 的矩阵 P , P ( i , j )表示第 i 个员工对第 j 个区域的喜好度。 答案输出: 对于每个测试数据,输出可以达到的最大的喜好程度。 输入样例3 3 1 1 1 100 50 25 100 50 25 100 50 25 输出样例175 数据解释:此数据只存在一种安排方法,三个员工分别安置在三个区域。最终的喜好程度为 100+50+25=175 代码为:#include<stdio.h>int main(){    int m,n,sum=0,s;    printf("请输入区域数和人数:\n");    scanf("%d",&n);    scanf("%d",&m);    int a[100],b[100][100];    printf("输入各个区域的容纳人数:\n");    int i,j;    for(i=0;i<n;i++)        scanf("%d",&a[i]);    printf("输入每个人对各区域的喜好度:\n");    for(i=0;i<m;i++)        for(j=0;j<n;j++)            scanf("%d",&b[i][j]);    s=m;    while(s)    {        int max=0,h,l;        for(i=0;i<m;i++)            for(j=0;j<n;j++)                if(b[i][j]>max)                {                    max=b[i][j];                    h=i;                    l=j;                }        --a[l];        if(a[l]==0)        {            for(i=0;i<m;i++)                b[i][l]=0;        }        for(j=0;j<n;j++)            b[h][j]=0;        sum=sum+max;        --s;    }    printf("最大喜好度是:%d\n",sum);    return 0;}1.#include<iostream>using namespace std;void main(){   int N,M,i,j;    cin>>N>>M;    int cap[300];    for (i=0;i<N;i++)    {        cin>>cap[i];    }int favour[90000];    for (j=0;j<M*N;j++)    {        cin>>favour[j];    }        int areanum,k,h,sum=0,max,runtime=M;    while(runtime>0)    {        max=-1;        for (j=0;j<M*N;j++)        {            if(favour[j]>=max)            {                max=favour[j];                k=j;            }        }        areanum=k%N;        if(cap[areanum]>0)        {            cap[areanum]--;            sum=sum+max;            for(h=k-areanum;h<=k-areanum+N-1;h++)            {                favour[h]=-1;            }            runtime--;        }        if(cap[areanum]==0)        {            for(int a=0;a<N;a++)            {                favour[areanum+a*M]=-1;            }        }    }    cout<<"the result is:"<<" "<<sum;        system("pause");}2.#include<stdio.h>int max(int* a,int n) //求一整型数组最大值{int max=0,i; for(i=0;i<n;i++) {if(a[i]>max) max=a[i];} return max;}int sort1(int* a,int n)//对一个整型数组冒泡排序{ int i,j,k;for(j=0;j<n-1;j++) for(i=0;i<n-1-j;i++){if(a[i]<a[i+1]) { k=a[i]; a[i]=a[i+1]; a[i+1]=k; } }}int sort(int n,int m,int a[n],int p[m][n])//座位分配函数{ int b[n][m]={}; int c[m][n]; int sum[n]={}; int i,j,count=0; for(i=0;i<m;i++)for(j=0;j<n;j++) {c[i][j]=p[i][j];}for(j=0;j<n;j++) { for(i=0;i<m;i++){ if(p[i][j]==max(&c[i][0]),j){ b[j][count]=p[i][j];count++; } } if(count<=a[j]){ for(i=0;i<count;i++) { sum[j]+=b[j][i]; } } else { sort1(*b[j][0],m);for(i=0;i<a[j];i++) sum[j]+=b[j][i]; } } }int main(){int Sum=0; int sort(int n,int m,int a[n],int p[m][n]);for(i=0;i<n;i++)Sum+=sum[i]; return Sum;printf("Sum:%d",Sum);}3.#include <stdio.h>void main(){int a[100],n,m,i,j,g=0;int b[10][10];scanf("%d%d",&n,&m);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<n;i++)for(j=0;j<m;j++)scanf("%d",&b[i][j]);for(i=0;i<n;i++)g+=b[0][i];printf("\n%d\n",g);}4.//head.hvoid accommodate(int *(&a),int N,int M);//实现容纳数组的赋值void love(int**(&L),int,int);//实现喜好程序M*N的矩阵的输入;long anneal(int**,bool**,int N,int M);//退火算法得出最大的喜好程度bool** initia(int *a,int N,int M);//退火算法的0-1初始化矩阵//函数实现.cpp#include <iostream>#include <malloc.h>#include <iomanip>#include <time.h>using namespace std;void accommodate(int *(&a),int N,int M){//实现容纳数组的赋值;    int i,m=0;//m为当前容纳数组的和    a=(int*)malloc(N*sizeof(int));    if(a==NULL){        cout<<"第一次内存分配失败,进行第二次内存分配"<<endl;        a=(int*)malloc(N*sizeof(int));    }    cout<<"请输入每个区域中的工作人员数并且之和为"<<M<<        ",如果不等于,系统会提示重新输入"<<endl;    for(i=0;i<N;i++)        *(a+i)=0;//为容纳数组赋初值    for(i=0;i<N;i++){        cin>>*(a+i);        if((m+=*(a+i))>M){            cout<<"您当前的输入已经大于了员工总人数"<<M<<"请重新输入"<<endl;            i=0;            continue;        }        if(i==N-1 && m<M){            cout<<"您当前的输入小于员工总人数"<<M<<"请重新输入"<<endl;            i=0;            continue;        }    }}void love(int **(&l),int N,int M){//实现喜好程序M*N的矩阵的输入;    int i,j;    l=(int**)malloc(M*sizeof(int*));    for(i=0;i<M;i++)        *(l+i)=(int*)malloc(N*sizeof(int));    cout<<"请输入"<<M<<"*"<<N<<"的喜好程序矩阵每个元素"<<        "的范围为0~100如有一个不在该区间则重新输入"<<endl;    for(i=0;i<M;i++)        for(j=0;j<N;j++){            cin>>*(*(l+i)+j);            if(*(*(l+i)+j)<0 || *(*(l+i)+j)>100){                j=N;i=-1;            cout<<"您输入的数据不在0~100内故请重新输入"<<endl;            }        }    cout<<"您输入的喜好程度矩阵为"<<endl;    for(i=0;i<M;i++){        for(j=0;j<N;j++)            cout<<setw(5)<<*(*(l+i)+j);        cout<<endl;    }}bool **initia(int *a,int N,int M){//退火算法的0-1初始化矩阵,a是岗位员工数组    bool **init;    int i,j,k=0;    init=(bool**)malloc(M*sizeof(bool*));    for(i=0;i<M;i++)        *(init+i)=(bool*)malloc(N*sizeof(bool));    for(i=0;i<M;i++)        for(j=0;j<N;j++)            *(*(init+i)+j)=0;    i=0;    for(j=0;j<N;j++){        for(i;i<(*(a+j)+k);i++)            *(*(init+i)+j)=1;        k+=*(a+j);    }    return init;}long anneal(int **l,bool **init,int N,int M){//退火算法得出最大的喜好程度    //l为喜好程度矩阵,a为容纳员工数数组;    //初始化0-1矩阵,每行=1,第i列的和为a[i]    int i,j,r1,r2;//做交换的两行其值不能相等    long max=0,tmp,count=0;    for(i=0;i<M;i++)        for(j=0;j<N;j++)            if(*(*(init+i)+j)==1)                max+=*(*(l+i)+j);//初始化时的喜好程度    srand(time(0));    while(count<10000){    do{    r1=rand()%M;r2=rand()%M;    }while(r1==r2);    for(j=0;j<N;j++){        if(init[r1][j]==1 && init[r2][j]==0){            init[r1][j]=0;init[r2][j]=1;        }        else if(init[r1][j]==0 && init[r2][j]==1){            init[r1][j]=1;init[r2][j]=0;        }    }    tmp=0;    for(i=0;i<M;i++)        for(j=0;j<N;j++)            if(*(*(init+i)+j)==1)                tmp+=*(*(l+i)+j);    if(tmp<max)    for(j=0;j<N;j++){        if(init[r1][j]==1 && init[r2][j]==0){            init[r1][j]=0;init[r2][j]=1;        }        else if(init[r1][j]==0 && init[r2][j]==1){            init[r1][j]=1;init[r2][j]=0;        }    }    else{        max=tmp;count++;    }    }    cout<<"\n所得结果的0-1矩阵为"<<endl;    for(i=0;i<M;i++){        for(j=0;j<N;j++)            cout<<setw(4)<<*(*(init+i)+j);        cout<<endl;    }    return max;}//main.cpp//本题给我的第一感觉是运用退火算法去解决#include <iostream>#include <malloc.h>#include <iomanip>using namespace std;int main(){    int N,M,*a=NULL,**L=NULL;//喜好度矩阵    bool **ini=NULL;//位置0-1矩阵    long max;//最大满意度    //N为区域数,M为员工数,a为每个区域的员工数,长度为N,其和为M    cout<<"请输入区域数及公司的员工数 :"<<endl;    cin>>N >>M;    accommodate(a,N,M);    love(L,N,M);    ini=initia(a,N,M);    max=anneal(L,ini,N,M);    cout<<"最大值为: "<<max<<endl;    return 0;}5.#include <stdio.h>void sort(int a[],int b[])//b函数得到a函数大小排序的下标值{   int i,j,max,t;//b保存下标   int length=sizeof(a);   for(i=0;i<length-1;i++)   {      max=-1;      t=0;      for(j=0;j<length-1;j++)      {         if(i==0)         {              if(a[j]>max)             {                max=a[j];                t=j;             }         }else {             if(a[j]>max&&a[j]<a[b[i-1]])             {                  max=a[j];                 t=j;             }         }      }      b[i]=t;   }}void main(){   int i,m,n,a[100],b[100],c[100],j,total;   scanf("%d%d",&n,&m);//n代表区 m代表人   for(i=0;i<n;i++)   {        scanf("%d",&a[i]);//获得每个区的人数   }   total=0;      for(i=0;i<m;i++)      {           for(j=0;j<n;j++)              {                  scanf("%d",&b[j]);              }              sort(b,c);           for(j=0;j<n;j++) //获取某人属于哪个区           {               if(a[c[j]]!=0)               {                   a[c[j]]--;                   printf("______%d\n",b[c[j]]);                   total+=b[c[j]];                   break;               }           }      }      printf("%d",total);}

原创粉丝点击