AtCoder Beginner Contest 001
はい。
AtCoder Beginner Contest 001
この回ってとにかく場合分けと誤差対策がとてもめんどくさい。
A - 積雪深差
#include<bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=0;i<n;++i) #define per(i,n) for(int i=n-1;i>=0;--i) #define sc1(a) scanf("%d",&a) #define sc2(a,b) scanf("%d %d",&a,&b) #define sc3(a,b,c) scanf("%d %d %d",&a,&b,&c) #define sl1(a) scanf("%lld",&a) #define sl2(a,b) scanf("%lld %lld",&a,&b) #define sl3(a,b,c) scanf("%lld %lld %lld",&a,&b,&c) #define PI 3.1415926535897932 //int64_t はatcoderメリット不明のため long long #define ll long long //#define ll int64_t #define print(a) cout << a << endl // int souwa(int a) {return (1+a)*a/2;} int lcm(int a,int b) { return a*b/__gcd(a,b); } //l l lcm(ll a,ll b) { return a*b/__gcd(a,b); } // bool sankaku(int a,int b,int c) {vector <int> t={a,b,c};sort(t.begin(),t.end()); return t.at(0)+t.at(1)>t.at(2);}; /** sort(ar.begin(),ar.end()) int sum=accumulate(ar.begin(),ar.end(),0); do {// do内部で作られた順列に対して必要な処理を行う // cout << w.at(0) << w.at(1) << w.at(2) << endl; } while (next_permutation(w.begin(),w.end())); //ex. vector <int> w= {1,2,3}; **/ // 何か貼るときはココから下に int main(){ int mod=1000000007; int n,m,x,y,cnt=0,ans=0; string s,t; cin >> n; cin >> m; //vector<int> a(n); //rep(i,n) cin >> a.at(i); //sort(a.begin(),a.end()); //scanf("%d %d",&n,&m); print(n-m); return 0; }
引き算します。
B - 視程の通報
#include<bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=0;i<n;++i) #define per(i,n) for(int i=n-1;i>=0;--i) #define sc1(a) scanf("%d",&a) #define sc2(a,b) scanf("%d %d",&a,&b) #define sc3(a,b,c) scanf("%d %d %d",&a,&b,&c) #define sl1(a) scanf("%lld",&a) #define sl2(a,b) scanf("%lld %lld",&a,&b) #define sl3(a,b,c) scanf("%lld %lld %lld",&a,&b,&c) #define PI 3.1415926535897932 //int64_t はatcoderメリット不明のため long long #define ll long long //#define ll int64_t #define print(a) cout << a << endl // int souwa(int a) {return (1+a)*a/2;} int lcm(int a,int b) { return a*b/__gcd(a,b); } //l l lcm(ll a,ll b) { return a*b/__gcd(a,b); } // bool sankaku(int a,int b,int c) {vector <int> t={a,b,c};sort(t.begin(),t.end()); return t.at(0)+t.at(1)>t.at(2);}; /** sort(ar.begin(),ar.end()) int sum=accumulate(ar.begin(),ar.end(),0); do {// do内部で作られた順列に対して必要な処理を行う // cout << w.at(0) << w.at(1) << w.at(2) << endl; } while (next_permutation(w.begin(),w.end())); //ex. vector <int> w= {1,2,3}; **/ // 何か貼るときはココから下に int main(){ int mod=1000000007; int n,m,x,y,cnt=0,ans=0; string s,t; cin >> n; //cin >> m; //vector<int> a(n); //rep(i,n) cin >> a.at(i); //sort(a.begin(),a.end()); //scanf("%d %d",&n,&m); if (n<100) print("00"); else if (n<=5000) printf("%02d\n",n/100); else if (n<=30000) print(n/1000+50); else if (n<=70000) print((n/1000-30)/5+80); else print(89); return 0; }
ルールから外れるような値は発生しないらしいので問題文の指示通りに。実数は信用できないので整数だけで処理するように。
C - 風力観測
#include<bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=0;i<n;++i) #define per(i,n) for(int i=n-1;i>=0;--i) #define sc1(a) scanf("%d",&a) #define sc2(a,b) scanf("%d %d",&a,&b) #define sc3(a,b,c) scanf("%d %d %d",&a,&b,&c) #define sl1(a) scanf("%lld",&a) #define sl2(a,b) scanf("%lld %lld",&a,&b) #define sl3(a,b,c) scanf("%lld %lld %lld",&a,&b,&c) #define PI 3.1415926535897932 //int64_t はatcoderメリット不明のため long long #define ll long long //#define ll int64_t #define print(a) cout << a << endl // int souwa(int a) {return (1+a)*a/2;} int lcm(int a,int b) { return a*b/__gcd(a,b); } //l l lcm(ll a,ll b) { return a*b/__gcd(a,b); } // bool sankaku(int a,int b,int c) {vector <int> t={a,b,c};sort(t.begin(),t.end()); return t.at(0)+t.at(1)>t.at(2);}; /** sort(ar.begin(),ar.end()) int sum=accumulate(ar.begin(),ar.end(),0); do {// do内部で作られた順列に対して必要な処理を行う // cout << w.at(0) << w.at(1) << w.at(2) << endl; } while (next_permutation(w.begin(),w.end())); //ex. vector <int> w= {1,2,3}; **/ // 何か貼るときはココから下に int main(){ int mod=1000000007; int n,m,x,y,cnt=0,ans=0; string s,t; cin >> n; cin >> m; n*=10; m=m*10/6; if (n>=1125 && n<3375) s="NNE " ; else if (n>=3375 && n<5625) s="NE " ; else if (n>=5625 && n<7875) s="ENE " ; else if (n>=7875 && n<10125) s="E " ; else if (n>=10125 && n<12375) s="ESE " ; else if (n>=12375 && n<14625) s="SE " ; else if (n>=14625 && n<16875) s="SSE " ; else if (n>=16875 && n<19125) s="S " ; else if (n>=19125 && n<21375) s="SSW " ; else if (n>=21375 && n<23625) s="SW " ; else if (n>=23625 && n<25875) s="WSW " ; else if (n>=25875 && n<28125) s="W " ; else if (n>=28125 && n<30375) s="WNW " ; else if (n>=30375 && n<32625) s="NW " ; else if (n>=32625 && n<34875) s="NNW " ; else s="N "; if (m<25) m=0; else if(m<155) m=1; else if(m<335) m=2; else if(m<545) m=3; else if(m<795) m=4; else if(m<1075) m=5; else if(m<1385) m=6; else if(m<1715) m=7; else if(m<2075) m=8; else if(m<2445) m=9; else if(m<2845) m=10; else if(m<3265) m=11; else m=12; if(m==0) s="C "; cout << s << m << endl; //vector<int> a(n); //rep(i,n) cin >> a.at(i); //sort(a.begin(),a.end()); //scanf("%d %d",&n,&m); //print(ans); return 0; }
方角は一定の値ごとに変わってるはずなので1125引いて一定の値で割った結果によってENEとか分かったりするはず。多分。全部書きましたけど。
D - 感雨時刻の整理
#include<bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=0;i<n;++i) #define per(i,n) for(int i=n-1;i>=0;--i) #define sc1(a) scanf("%d",&a) #define sc2(a,b) scanf("%d %d",&a,&b) #define sc3(a,b,c) scanf("%d %d %d",&a,&b,&c) #define sl1(a) scanf("%lld",&a) #define sl2(a,b) scanf("%lld %lld",&a,&b) #define sl3(a,b,c) scanf("%lld %lld %lld",&a,&b,&c) #define PI 3.1415926535897932 //int64_t はatcoderメリット不明のため long long #define ll long long //#define ll int64_t #define print(a) cout << a << endl // int souwa(int a) {return (1+a)*a/2;} int lcm(int a,int b) { return a*b/__gcd(a,b); } //l l lcm(ll a,ll b) { return a*b/__gcd(a,b); } // bool sankaku(int a,int b,int c) {vector <int> t={a,b,c};sort(t.begin(),t.end()); return t.at(0)+t.at(1)>t.at(2);}; /** sort(ar.begin(),ar.end()) int sum=accumulate(ar.begin(),ar.end(),0); do {// do内部で作られた順列に対して必要な処理を行う // cout << w.at(0) << w.at(1) << w.at(2) << endl; } while (next_permutation(w.begin(),w.end())); //ex. vector <int> w= {1,2,3}; **/ // 何か貼るときはココから下に int main(){ int mod=1000000007; int n,m,x,y,cnt=0,ans=0; string s,t; cin >> n; vector<vector<int>> a(25,vector<int>(61)); rep(i,25) rep(j,61) a.at(i).at(j)=0; rep(i,n){ scanf("%d-%d",&x,&y); a.at(x/100).at(x%100/10*10+((x%10<5)?0:5))++; if(y%10>5) y=y-y%10+10; else if(y%10==5) true; else if(y%10>0) y=y-y%10+5; if (y%100==60) y+=40; a.at(y/100).at(y%100)--; //cout << x << endl; } rep(i,25) rep(j,60) { if(a.at(i).at(j)>0 && cnt==0) { printf("%02d%02d-",i,j); } else if(a.at(i).at(j)==cnt*-1 && cnt>0) { printf("%02d%02d\n",i,j); } cnt+=a.at(i).at(j); } return 0; }
0時から24時まで25時間分の配列を用意してよしなに。おそらく通称いもす法が無難な管理・更新方法だと思うけど賢い人は他になんかあるのかもしれないですけど探す気力なし。