ともちんの美容室ステマ
タイトルはなにも関係ありません
AOJ 0562
俗に言うJOI王国のお買い物
難しく考えてたけど全ての点のお祭り距離を出して、ある二点間の距離+二点のお祭り距離を2で割るだけだった
#include <cstdio> #include <climits> #include <vector> #include <algorithm> #include <queue> #include <map> #include <functional> using namespace std; typedef pair<int, int> P; struct edge { int to, cost; }; vector<edge> G[3000]; int mind[3000]; int d[3000]; int n, m, k; void dijkstra(int s) { fill(d, d+n, INT_MAX); d[s]=0; priority_queue<P, vector<P>, greater<P> > que; que.push(P(0,s)); while (!que.empty()) { P p=que.top(); que.pop(); int v=p.second; if (d[v]<p.first) continue; for (int i=0; i<G[v].size(); i++) { edge e=G[v][i]; if (d[e.to]>d[v]+e.cost) { d[e.to]=d[v]+e.cost; que.push(P(d[e.to],e.to)); } } } for (int i=0; i<n; i++) mind[i]=min(mind[i],d[i]); } int main() { scanf("%d%d%d",&n,&m,&k); fill(mind, mind+n, INT_MAX); for (int i=0; i<m; i++) { int a, b, l; scanf("%d%d%d",&a,&b,&l); G[a-1].push_back((edge){b-1,l}); G[b-1].push_back((edge){a-1,l}); } for (int i=0; i<k; i++) { int s; scanf("%d",&s); dijkstra(s-1); } int res=0; for (int i=0; i<n; i++) { for (int j=0; j<G[i].size(); j++) { edge e=G[i][j]; res=max(res,(mind[i]+mind[e.to]+e.cost+1)/2); } } printf("%d\n",res); }
Banner
やったよ!通せたよ!!!
カンニングしたけどね(白目)
#include <cstdio> typedef long long ll; int ban[400][400]; int brow[400], grow[400], wrow[400]; int bcol[400], gcol[400], wcol[400]; int main() { int h, w; scanf("%d%d",&h,&w); for (int i=0; i<h; i++) for (int j=0; j<w; j++) scanf("%d",&ban[i][j]); for (int i=0; i<h; i++) { for (int j=0; j<w; j++) { if (ban[i][j]==1) { grow[i]++; gcol[j]++; } else if (ban[i][j]==2) { wrow[i]++; wcol[j]++; } else { brow[i]++; bcol[j]++; } } } ll res=0; for (int i=0; i<h; i++) for (int j=0; j<w; j++) { if (ban[i][j]==0) { res+=grow[i]*wcol[j]+gcol[j]*wrow[i]; } else if (ban[i][j]==1) { res+=brow[i]*wcol[j]+bcol[j]*wrow[i]; } else { res+=brow[i]*gcol[j]+bcol[j]*grow[i]; } } printf("%lld\n",res/2); }
JOI Poster
なんか巷で再帰でゴリゴリとか言ってましたが
僕はループでごりごりしてました
#include <cstdio> #include <iostream> using namespace std; int len; int main() { int n, k; scanf("%d%d",&n,&k); len=1<<n; string res=""; if (k<=len/2) { for (int i=0; i<len/2; i++) res+='J'; for (int i=0; i<len/2; i++) res+='O'; } else { int temp=0; int x=n-1; temp+=1<<x; if ((1<<n)==k) { x=0; } else { while (temp<k) temp+=1<<(--x); x++; } for (int i=0; i<(1<<n)-(1<<x); i++) res+='I'; x--; if (x<0) res+='J'; else { for (int i=0; i<1<<x; i++) res+='J'; while (res.length()<(1<<n)) { res+='O'; } } } cout<<res<<endl; }