第11回JOI
一昨日の
1.ランチ
3項演算子は知ってたけど、minはさっき知った。
#include <iostream> using namespace std; int main(){ int c[5]; int i; for(i=0; i<5; i++){ cin>>c[i]; } for(i=1; i<3; i++){ if(c[0]>c[i])c[0]=c[i];//c[0]=min(c[0],c[i]); } if(c[3]>c[4])c[3]=c[4];//c[3]=min(c[3],c[4]); cout<<c[0]+c[3]-50; return 0; }
2.サッカー
点数を計算してソートした。ifが多い理由は上参照
#include <functional> #include <iostream> #include <vector> using namespace std; int main(){ int N,i,j; cin>>N; vector<int> T(N,0); int Ns=N*(N-1)/2; vector<vector<int> > P(Ns,vector<int>(4)); for(i=0; i<Ns; i++){ for(j=0;j<4;j++){ cin>>P[i][j]; } } for(i=0; i<Ns; i++){ if(P[i][2]>P[i][3])T[P[i][0]-1]+=3; if(P[i][2]<P[i][3])T[P[i][1]-1]+=3; if(P[i][2]==P[i][3]){ T[P[i][0]-1]++; T[P[i][1]-1]++; } } vector<int> S(T); sort(S.begin(),S.end(),greater<int>()); for(i=0;i<N; i++){ for(j=0;j<N;j++){ if(T[i]==S[j]){ T[i]=j+1; break; } } } for(i=0; i<N; i++){ cout<<T[i]<<endl; } return 0; }
3.最高のピザ
ソートして、最高のトッピングを試していく。誤差が怖かったから掛け算したけど、恐らく意味がない。
#include <iostream> #include <functional> #include <vector> using namespace std; int main(){ int N; int i,j,k; int A,B; int C; cin>>N>>A>>B>>C; vector<int>D(N); for(i=0; i<N; i++) cin>>D[i]; sort(D.begin(),D.end(),greater<int>()); int cal=C; int cal2=C; int cost=A; int cost2=A; for(i=0; i<N; i++){ cal2+=D[i]; cost2+=B; if(cal2*cost<cal*cost2) break; cal=cal2; cost=cost2; } cout<<cal/cost; return 0; }
4.パスタ
自分のコードは間違って消しちゃった。
2時間以上デバッグしてたけど、結局解けなかった。論理的に正しそうだったけど、たぶん思い込み。
5.イルミネーション
解いてない。あとで解く予定。
外:-1、未確定:0、建物、1、建物の中確定:2
で一回り大きく作ってDFSすれば解けたかもしれない。建物全てで外といくつの辺で隣接してるかを調べて、たぶん行ける。
6.ジグザグ数
解いてないけど、終了後に、総当たりで入力1だけ処理できるスクリプトを書いた。間違ってるかもしれない。
s = gets.to_i t = gets.to_i d = gets.to_i ret = 0 for n in s..t do fg = n % d if fg == 0 then if n <= 10 then ret += 1 next end dif = (n % 10) - ((n / 10) % 10) n = n / 10 dif2 = (n % 10) - ((n / 10) % 10) if n < 10 && dif != 0 then ret += 1 next end while (dif*dif2)<0 dif = dif2 n = n / 10 dif2 = (n % 10) - ((n / 10) % 10) if n < 10 && dif2 != 0 then ret += 1 break end end end end puts ret%10000