一个国贸作业

来源:互联网 发布:中国审美欧化 知乎 编辑:程序博客网 时间:2024/05/01 23:55
我现在在大学读的是经济学专业,上周国贸老师布置了一个作业,让我们计算出全球所有国家所有出口产品的显示比较优势指数和技术附加值,因为有20多万组数据,所以我马上想到了写代码,没什么算法难度,但是数据多,并且找的数据是有问题的,花了两节晚自习肉眼查错,把二十多万组数据里的十个左右的错误找出来了,然后是排序,相当于把一组数据分成5分,要求对每一份算个方差,求最优策略
#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;const int n = 206928;const int m = 2645;int hash[100000];double sum=0;double gvs[1000],w[250000],irca[100000]; double rtv[250000],rca[250000],ivs[100000];double dp[m+100][10];double ff[m+100],g[m+100];int mean[m+100][10];struct node{int gd,sd;double v,gdp;}f[250000];void init(){freopen("gmin.txt","r",stdin);freopen("gmout.txt","w",stdout);}void readdata(){int u=1;double t;for(int i=1;i<=n;i++){scanf("%d",&f[i].gd);if(u!=f[i].gd||i==1){scanf("%d%lf%lf",&f[i].sd,&f[i].v,&f[i].gdp);u=f[i].gd;t=f[i].gdp;}else {scanf("%d%lf",&f[i].sd,&f[i].v);f[i].gdp = t;}}for(int i=1;i<=n;i++) sum += f[i].v;for(int i=1;i<=300;i++) gvs[i]=0;for(int i=1;i<=100000;i++) {hash[i]=0;ivs[i]=0;}for(int i=1;i<=1000;i++) gvs[i] = 0;for(int i=1;i<=250000;i++) {w[i] = 0;rca[i] = 0;rtv[i]=0;}for(int i=1;i<=100000;i++) irca[i] = 0;for(int i=1;i<=m;i++)for(int j=1;j<=5;j++)dp[i][j]=1000000000;}double fc(int a,int b){if(a==b)  return 0;double r=0,t;t=(ff[b]*b-ff[a-1]*(a-1))/(b-a+1);for(int i=a;i<=b;i++) r+=sqrt((g[i]-t)*(g[i]-t)/(b-a+1));return r;}void work(){int u=f[1].gd;gvs[f[1].gd] += f[1].v;for(int i=2;i<=n;i++){if(u==f[i].gd){gvs[f[i].gd] += f[i].v; } else{gvs[f[i].gd] += f[i].v;u=f[i].gd;}}for(int i=1;i<=n;i++){if(hash[f[i].sd]) continue;else {hash[f[i].sd] = 1;ivs[f[i].sd] += f[i].v;}for(int j=i+1;j<=n;j++){if(f[j].sd == f[i].sd) {ivs[f[j].sd]+=f[j].v;}}}for(int i=1;i<=n;i++){rca[i] = ((f[i].v / ivs[f[i].sd])/(gvs[f[i].gd]/sum));}int p;for(int i=1;i<=100000;i++) hash[i]=0;for(int j=1;j<=n;j++){if(hash[f[j].sd]) continue;hash[f[j].sd] = 1;p=f[j].sd;irca[f[j].sd] += rca[j];for(int i=j+1;i<=n;i++){if(f[i].sd == p){irca[f[i].sd] += rca[i];}}}for(int i=1;i<=n;i++){w[i] = rca[i] / irca[f[i].sd];}for(int i=1;i<=100000;i++) hash[i]=0;for(int i=1;i<=n;i++) {if(hash[f[i].sd]) continue;hash[f[i].sd]=1;double amount=0;p=f[i].sd;for(int j=i;j<=n;j++){if(f[j].sd == p)amount += w[j]*(log(f[j].gdp)/log(exp(1))); }rtv[i]=amount;}p=1;for(int i=1;i<=n;i++){if(rtv[i]){g[p] = rtv[i];p++;}}}void classify(){sort(g,g+m+1);ff[1]=g[1];for(int i=2;i<=m;i++) ff[i]=(ff[i-1]*(i-1)+g[i])/i;for(int i=1;i<=m;i++) dp[i][1]=fc(1,i);for(int j=2;j<=5;j++)for(int i=j;i<=m;i++)for(int k=j-1;k<i;k++){if(dp[i][j] > dp[k][j-1]+fc(k+1,i)){dp[i][j]=dp[k][j-1]+fc(k+1,i);mean[i][j]=k;}}//printf("%lf\n",dp[m][5]);int x=mean[m][5];printf("%d\n",x);x=mean[x][4];printf("%d\n",x);x=mean[x][3];printf("%d\n",x);x=mean[x][2];printf("%d\n",x);}int main(){init();readdata();work();classify();return 0;}

0 0
原创粉丝点击