お久しぶりです。
参加記の前に前回の記事から何をしていたかちょこっと。
5月から8月までソフトウェアの制作をしていました。
とある大会に向けてです。
あと、受験で必要な書類や資料の作成、勉強もしてました。
ソフトウェアについては大会類全部終わったら詳細書きますね。
ついでに今日はPCKでした。
ペアは後輩で、正直一人で解いてました...。
結果
○○○○○○△△×
みたいな感じで、7はTLE,8はバグ取れなかったのでちょっと残念。
ただし毎年地域の枠があるので、なんとか本選行けそうな様子。
問題について書きますが、8,9は再挑戦するので省略。
1問目
問題読んでない。後輩くんがやってくれたらしい。
#include<iostream> using namespace std; int main() { int a , b; for (int i = 0; i < 7; i++){ int ans = 0; cin >> a >> b; ans += a - b; cout << ans << endl; } return 0; }
2問目
これも後輩くんが(ry
#include<iostream> using namespace std; int h[5] = {0 , 6000 , 4000 , 3000 , 2000}; int main(void) { int t , n; for (int i = 0; i < 4; i++){ int ans = 0; cin >> t >> n; ans = h[t] * n; cout << ans << endl; } return 0; }
3問目
解法書いた紙投げて実装してもらった。
5以上,2以上でない場合に割引したときの価格と原価を比べるだけ。
#include<iostream> #include<algorithm> using namespace std; int main() { int n = 0; cin >> n; for (int i = 0; i < n; i++){ int x , y , b, p; cin >> x >> y >> b >> p; int normal = 0 , max = 0; normal = x * b + y * p; max = x * b + y * p; if (b >= 5 && p >= 2){ normal = (double)normal * 0.8; cout << normal << endl; continue; } if (b < 5){ max += x * (5 - b); } if (p < 2){ max += y * (2 - p); } max = (double)max * 0.8; max = std::min(normal , max); cout << max << endl; } return 0; }
4問目
これも解放投げて実装してもらった。
(N種類のカプセルから0個のカプセルを含めない種類の数)+1 で求まる。
ただ、2以上の数字が無いときは場合分けが必要。
#include<iostream> using namespace std; int main() { int n; while (cin >> n , n){ int cnt = 0; bool flag = false; for (int i = 0; i < n; i++){ int k = 0; cin >> k; if (k){ cnt++; } if (k > 1){ flag = true; } } if (cnt && flag){ cout << cnt + 1 << endl; }else{ cout << "NA" << endl; } } return 0; }
5問目
さすがにそろそろやらなきゃ後輩に申し訳なかったのでやった。
シミュレートするだけ。
思えばこのコードが半年ぶりに書いた競技のコードだった。。。
#include<iostream> #include<string> #include<algorithm> using namespace std; int main() { int m[11]; int n; while(cin >> n,n){ for(int i=0;i<11;i++){ m[i]=0; } int ba=0,u=0; string str; cin >> str; for(int i=0;i<str.size();i++){ if(str[i]=='S'){ m[u]++; ba+=m[u]; m[u]=0; }else if(str[i]=='L'){ m[u]++; m[u]+=ba; ba=0; }else if(str[i]=='M'){ m[u]++; } u++; if(u==n){ u=0; } } sort(m,m+n); for(int i=0;i<n;i++){ cout << m[i] << " "; } cout << ba << endl; } return 0; }
6問目
解いた。
N→A→Cの順に使っていけばいいかなーって思った。
オーダーとか特に考えてない。
#include<iostream> #include<algorithm> using namespace std; int main() { int n; cin >> n; for(int i=0;i<n;i++){ int c=0,a=0,n=0,cnt=0; cin >> c >> a >> n; while(n>=1 && a>=1 && c>=1){ n--;a--;c--; cnt++; } while(a>=1 && c>=2){ a--;c-=2; cnt++; } while(c>=3){ c-=3; cnt++; } cout << cnt << endl; } return 0; }
7問目
このコードだとTLEします。
解法聞いててセグ木とかsetとか頭いいなーって思った(こなみ)
setでやろうと思ったけど仕様が不鮮明だったので愚直にやって撃沈。
#include<iostream> #include<vector> #include<algorithm> #include<map> #include<queue> #define mp make_pair using namespace std; typedef pair<int,int> Pii; int t[100001]; int p[100001]; int main() { int n,r,l; cin >> n >> r >> l; vector<pair<int,pair<int,int> > > v; for(int i=0;i<r;i++){ int a,b,c; cin >> a >> b >> c; v.push_back(make_pair(a-1,make_pair(b,c))); } vector<Pii> vk; int now=0; for(int i=0;i<n;i++){ vk.push_back(mp(i,0)); } for(int i=0;i<v.size();i++){ t[vk.front().first]+=v[i].second.first-now; now=v[i].second.first; Pii y;y=mp(v[i].first,p[v[i].first]+v[i].second.second); p[v[i].first]+=v[i].second.second; vector<Pii>::iterator it=vk.begin(); while(it!=vk.end()){ if(it->first==v[i].first){ vk.erase(it); break; } it++; } it=vk.begin(); while(y.second<it->second || (y.second==it->second && y.first>=it->first)){ it++; if(it==vk.end())break; } if(it==vk.end())vk.push_back(y); else vk.insert(it,y); } t[vk.front().first]+=l-now; int ans=0; for(int i=1;i<n;i++){ if(t[ans]<=t[i]){ ans=i; } } cout << ans+1 << endl; return 0; }