アルゴ式(beta版)の「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門からの出典です。
algo-method.com
アルゴ式とは...
>・プログラミングや情報科学をコツコツ学べる「教科書」
>・学んだ内容をゲーム感覚で大量に実践できる「練習問題」
>の2つで構成される、Web上で完結した学習コンテンツです。
C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門
僕が作成、提出したコードは、以下のとおりです。
データの分布を調べる
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 データの分布を調べる https://algo-method.com/tasks/701 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; using ll=long long; int main(void){ ll n; cin>>n; vector<ll> a(n); for(ll i=0;i<n;i++){ cin>>a[i]; } ll num=5; vector<ll> v={-1,20,40,60,80,100}; vector<ll> ans(num); for(ll i=0;i<num;i++){ ans[i]=count_if(a.begin(),a.end(), [&](ll x){return (v[i]<x && x<=v[i+1]);}); } for(ll i=0;i<num;i++){ cout<<ans[i]<<endl; } return 0; }
平均値
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 平均値 https://algo-method.com/tasks/694 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; int sum=0; for(int i=0;i<n;i++){ int a; cin>>a; sum+=a; } double ans=(double)sum/n; cout<<fixed<<setprecision(10)<<ans<<endl; return 0; }
中央値
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 中央値 https://algo-method.com/tasks/695 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<int> a(n); for(int i=0;i<n;i++){ cin>>a[i]; } sort(a.begin(),a.end()); if(n%2){ cout<<a[(n-1)/2]<<endl; }else{ double ans=(double)(a[n/2-1]+a[n/2])/2; cout<<fixed<<setprecision(10)<<ans<<endl; } return 0; }
最頻値
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 最頻値 https://algo-method.com/tasks/697 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<int> a(n); for(int i=0;i<n;i++){ cin>>a[i]; } vector<int> cnt(101); for(int i=0;i<n;i++){ cnt[a[i]]++; } int m=*max_element(cnt.begin(),cnt.end()); for(int i=0;i<101;i++){ if(cnt[i]==m){ cout<<i<<endl; } } return 0; }
データの散らばり1 (平均偏差)
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 データの散らばり1 (平均偏差) https://algo-method.com/tasks/703 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<int> a(n),b(n); double aveA=0,aveB=0; for(int i=0;i<n;i++){ cin>>a[i]; aveA+=a[i]; } aveA/=n; for(int i=0;i<n;i++){ cin>>b[i]; aveB+=b[i]; } aveB/=n; double ansA=0,ansB=0; for(int i=0;i<n;i++){ ansA+=abs(a[i]-aveA); ansB+=abs(b[i]-aveB); } ansA/=n; ansB/=n; if(ansA<ansB){ cout<<"A"<<endl; }else if(ansA>ansB){ cout<<"B"<<endl; }else{ cout<<"same"<<endl; } return 0; }
データの散らばり2-1 (分散)
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 データの散らばり2-1 (分散) https://algo-method.com/tasks/696 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<int> a(n),b(n); double aveA=0,aveB=0; for(int i=0;i<n;i++){ cin>>a[i]; aveA+=a[i]; } aveA/=n; for(int i=0;i<n;i++){ cin>>b[i]; aveB+=b[i]; } aveB/=n; double ansA=0,ansB=0; for(int i=0;i<n;i++){ ansA+=(a[i]-aveA)*(a[i]-aveA); ansB+=(b[i]-aveB)*(b[i]-aveB); } ansA/=n; ansB/=n; if(ansA<ansB){ cout<<"A"<<endl; }else if(ansA>ansB){ cout<<"B"<<endl; }else{ cout<<"same"<<endl; } return 0; }
データの散らばり2-2 (標準偏差)
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 データの散らばり2-2 (標準偏差) https://algo-method.com/tasks/707 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<double> a(n); for(int i=0;i<n;i++){ cin>>a[i]; } double ave=accumulate(a.begin(),a.end(),0.0)/n; double var=transform_reduce(a.begin(),a.end(),0.0, [](double d,double e){return d+e;}, [&](double d){return pow(d-ave,2);})/n; double ans=sqrt(var); cout<<fixed<<setprecision(10)<<var<<endl; cout<<fixed<<setprecision(10)<<ans<<endl; return 0; }
平均値をずらす
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 平均値をずらす https://algo-method.com/tasks/721 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; double ave=0.0; vector<double> a(n); for(int i=0;i<n;i++){ cin>>a[i]; ave+=a[i]; } ave/=n; for(int i=0;i<n;i++){ cout<<fixed<<setprecision(10)<<a[i]-ave<<((i==n-1) ? "\n" : " "); } return 0; }
平均値をずらしたデータの分散
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 平均値をずらしたデータの分散 https://algo-method.com/tasks/722 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ cout<<1<<endl; return 0; }
ばらつきの強調
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 ばらつきの強調 https://algo-method.com/tasks/723 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n,k; cin>>n>>k; vector<int> h(n); for(int i=0;i<n;i++){ cin>>h[i]; } for(int i=0;i<n;i++){ int x=k*h[i]; cout<<x<<((i==n-1) ? "\n" : " "); } return 0; }
ばらつきを強調したデータの分散
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 ばらつきを強調したデータの分散 https://algo-method.com/tasks/724 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n,k; cin>>n>>k; vector<int> h(n); for(int i=0;i<n;i++){ cin>>h[i]; } cout<<k*k<<endl; return 0; }
標準偏差の調整
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 標準偏差の調整 https://algo-method.com/tasks/725 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; double aveA,sdA,aveB,sdB; cin>>n>>aveA>>sdA>>aveB>>sdB; double ans=sdB/sdA; cout<<fixed<<setprecision(10)<<ans<<endl; return 0; }
データ全体の補正 (線形変換)
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 データ全体の補正 (線形変換) https://algo-method.com/tasks/727 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int ave,sd,a0,a1; cin>>ave>>sd>>a0>>a1; int aveANS=a0+a1*ave; int sdANS=a1*sd; cout<<aveANS<<" "; cout<<sdANS<<endl; return 0; }
標準化
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 標準化 https://algo-method.com/tasks/726 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<double> h(n); for(int i=0;i<n;i++){ cin>>h[i]; } double ave=accumulate(h.begin(),h.end(),0.0)/n; double var=transform_reduce(h.begin(),h.end(),0.0, [](double a,double b){return a+b;}, [&](double a){return pow(a-ave,2);})/n; double sd=sqrt(var); vector<double> x(n); for(int i=0;i<n;i++){ x[i]=(h[i]-ave)/sd; } for(int i=0;i<n;i++){ cout<<fixed<<setprecision(10)<<x[i]<<((i==n-1) ? "\n" : " "); } return 0; }
正規化
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 正規化 https://algo-method.com/tasks/728 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<double> h(n); double mi=300.0,ma=0.0; for(int i=0;i<n;i++){ cin>>h[i]; mi=min(mi,h[i]); ma=max(ma,h[i]); } for(int i=0;i<n;i++){ double x=(h[i]-mi)/(ma-mi); cout<<fixed<<setprecision(10)<<x<<((i==n-1) ? "\n" : " "); } return 0; }
四分位数
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 四分位数 https://algo-method.com/tasks/709 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; double f(vector<double> a,int l,int r){ if((r-l)%2){ int mid=l+(r-l-1)/2; return a[mid]; }else{ int mid=l+(r-l)/2; return (a[mid-1]+a[mid])/2; } } int main(void){ int n; cin>>n; vector<double> a(n); for(int i=0;i<n;i++){ cin>>a[i]; } sort(a.begin(),a.end()); double q1; if(n%2){ q1=f(a,0,(n-1)/2); }else{ q1=f(a,0,n/2); } double mid=f(a,0,n); double q3; if(n%2){ q3=f(a,(n-1)/2+1,n); }else{ q3=f(a,n/2,n); } cout<<q1<<" "<<mid<<" "<<q3<<endl; return 0; }
四分位範囲
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 四分位範囲 https://algo-method.com/tasks/716 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; double f(vector<double> x,int l,int r){ if((r-l)%2){ int mid=l+(r-l-1)/2; return x[mid]; }else{ int mid=l+(r-l)/2; return (x[mid-1]+x[mid])/2; } } double IQR(vector<double> x){ int xs=x.size(); double q1; if(xs%2){ q1=f(x,0,(xs-1)/2); }else{ q1=f(x,0,xs/2); } double q3; if(xs%2){ q3=f(x,(xs-1)/2+1,xs); }else{ q3=f(x,xs/2,xs); } double r=q3-q1; return r; } int main(void){ int n; cin>>n; vector<double> a(n),b(n); for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n;i++){ cin>>b[i]; } sort(a.begin(),a.end()); sort(b.begin(),b.end()); double aIQR=IQR(a); double bIQR=IQR(b); if(aIQR<bIQR){ cout<<"A"<<endl; }else if(aIQR==bIQR){ cout<<"same"<<endl; }else{ cout<<"B"<<endl; } return 0; }
データの散らばり 3-1 (偏差値 その1)
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 データの散らばり 3-1 (偏差値 その1) https://algo-method.com/tasks/712 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ double x,u,o; cin>>x>>u>>o; double ans=50.0+10.0*((x-u)/o); cout<<fixed<<setprecision(10)<<ans<<endl; return 0; }
データの散らばり 3-2 (偏差値 その2)
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 データの散らばり 3-2 (偏差値 その2) https://algo-method.com/tasks/708 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<double> a(n); for(int i=0;i<n;i++){ cin>>a[i]; } double ave=accumulate(a.begin(),a.end(),0.0)/n; double var=transform_reduce(a.begin(),a.end(),0.0, [](double d,double e){return d+e;}, [&](double d){return pow(d-ave,2);})/n; double sd=sqrt(var); double ans=50.0+(double)10*(a[0]-ave)/sd; cout<<fixed<<setprecision(10)<<ans<<endl; return 0; }
データ間の関係性1
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 データ間の関係性1 https://algo-method.com/tasks/710 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<int> a(n),b(n); for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n;i++){ cin>>b[i]; } double sumA=accumulate(a.begin(),a.end(),0.0); double sumB=accumulate(b.begin(),b.end(),0.0); double aveA=sumA/n; double aveB=sumB/n; cout<<fixed<<setprecision(10)<<min(aveA,aveB)/max(aveA,aveB)<<endl; return 0; }
データ間の関係性 2-1 (共分散)
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 データ間の関係性 2-1 (共分散) https://algo-method.com/tasks/713 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<double> a(n),b(n); double aveA=0.0,aveB=0.0; for(int i=0;i<n;i++){ cin>>a[i]; aveA+=a[i]; } aveA/=n; for(int i=0;i<n;i++){ cin>>b[i]; aveB+=b[i]; } aveB/=n; double ans=0.0; for(int i=0;i<n;i++){ ans+=(a[i]-aveA)*(b[i]-aveB); } ans/=n; cout<<fixed<<setprecision(10)<<ans<<endl; return 0; }
データ間の関係性 2-2 (相関係数)
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 データ間の関係性 2-2 (相関係数) https://algo-method.com/tasks/714 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<double> a(n),b(n); for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n;i++){ cin>>b[i]; } double aveA=accumulate(a.begin(),a.end(),0.0)/n; double aveB=accumulate(b.begin(),b.end(),0.0)/n; double cov=0.0; for(int i=0;i<n;i++){ cov+=(a[i]-aveA)*(b[i]-aveB); } cov/=n; double sdA=0.0,sdB=0.0; for(int i=0;i<n;i++){ sdA+=(a[i]-aveA)*(a[i]-aveA); sdB+=(b[i]-aveB)*(b[i]-aveB); } sdA=sqrt(sdA/n),sdB=sqrt(sdB/n); cout<<fixed<<setprecision(10)<<cov/sdA/sdB<<endl; return 0; }
正の相関と負の相関
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 正の相関と負の相関 https://algo-method.com/tasks/715 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; vector<double> a(n),b(n); for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n;i++){ cin>>b[i]; } double aveA=accumulate(a.begin(),a.end(),0.0)/n; double aveB=accumulate(b.begin(),b.end(),0.0)/n; double cov=0.0; for(int i=0;i<n;i++){ cov+=(a[i]-aveA)*(b[i]-aveB); } cov/=n; double sdA=0.0,sdB=0.0; for(int i=0;i<n;i++){ sdA+=(a[i]-aveA)*(a[i]-aveA); sdB+=(b[i]-aveB)*(b[i]-aveB); } sdA=sqrt(sdA/n),sdB=sqrt(sdB/n); double r=cov/sdA/sdB; if(r>0.3){ cout<<"Positive"<<endl; }else if(r<-0.3){ cout<<"Negative"<<endl; }else{ cout<<"No correlation"<<endl; } return 0; }
都道府県の面積最大値
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 都道府県の面積最大値 https://algo-method.com/tasks/734 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n=47; vector<string> x(n); vector<double> s(n); for(int i=0;i<n;i++){ cin>>x[i]>>s[i]; } double ave=accumulate(s.begin(),s.end(),0.0)/n; double var=transform_reduce(s.begin(),s.end(),0.0, [](double a,double b){return a+b;}, [&](double a){return pow(a-ave,2);})/n; double sd=sqrt(var); cout<<fixed<<setprecision(2); for(int i=0;i<n;i++){ double t=50+10.0*(s[i]-ave)/sd; double anst=round(t*100)/100; cout<<x[i]<<" "<<anst<<endl; } return 0; }
人口密度と平均年齢
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 人口密度と平均年齢 https://algo-method.com/tasks/733 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n=47; vector<string> x(n); vector<double> s(n),p(n),a(n); for(int i=0;i<n;i++){ cin>>x[i]>>s[i]>>p[i]>>a[i]; } vector<double> v(n); for(int i=0;i<n;i++){ v[i]=p[i]/s[i]; } double aveV=accumulate(v.begin(),v.end(),0.0)/n; double aveA=accumulate(a.begin(),a.end(),0.0)/n; double covVA=0.0; for(int i=0;i<n;i++){ covVA+=(v[i]-aveV)*(a[i]-aveA); } covVA/=n; double sdV=0.0,sdA=0.0; for(int i=0;i<n;i++){ sdV+=(v[i]-aveV)*(v[i]-aveV); sdA+=(a[i]-aveA)*(a[i]-aveA); } sdV/=n,sdA/=n; sdV=sqrt(sdV),sdA=sqrt(sdA); cout<<fixed<<setprecision(10)<<covVA/sdV/sdA<<endl; return 0; }
新たな代表値?
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 新たな代表値? https://algo-method.com/tasks/706 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int n; cin>>n; int sum=0; for(int i=0;i<n;i++){ int a; cin>>a; sum+=a; } double ans=(double)sum/n; cout<<fixed<<setprecision(10)<<ans<<endl; return 0; }
偏差値の最大値
/* C++による「設計技法とデータ構造 (#毎日アルゴ式)」プログラミングで学ぶデータサイエンス入門 偏差値の最大値 https://algo-method.com/tasks/702 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ double n; cin>>n; double ans=50.0+10.0*sqrt(n-1.0); cout<<fixed<<setprecision(10)<<ans<<endl; return 0; }
設問の出典は、情報科学をコツコツ積み立てて学習できるサービス「アルゴ式(beta版)」です。
algo-method.com