CF277.5に参加。
残念ながら苦手なタイプの問題のEが解けなかったが、それ以外はそこそこの時間で解けてまぁまぁの順位。
http://codeforces.com/contest/489/problem/C
問題
整数MとSが与えられる。
M桁で各桁の合計がSであるような数値のうち、最大値と最小値を答えよ。
解法
先にコーナーケースとしてS==0の時を処理しておく。
M>1だと条件を満たす数値は存在せず、M==1なら最大値も最小値も0である。
S>0の場合、最大値は上の桁から9を埋めていけば良い。
最小値は逆に下の桁から9を埋めていけば良いが、leading zeroは認められないので、先頭桁も最低1は残すようにしておく。
#include <bits/stdc++.h> using namespace std; typedef signed long long ll; #undef _P #define _P(...) (void)printf(__VA_ARGS__) #define FOR(x,to) for(x=0;x<to;x++) #define ITR(x,c) for(__typeof(c.begin()) x=c.begin();x!=c.end();x++) #define ALL(a) (a.begin()),(a.end()) #define ZERO(a) memset(a,0,sizeof(a)) #define MINUS(a) memset(a,0xff,sizeof(a)) //------------------------------------------------------- int M,S; char hoge[2][101]; void solve() { int i,j,k,l,r,x,y; string s; cin>>M>>S; if(S==0) { if(M==1) return _P("0 0\n"); else return _P("-1 -1\n"); } ZERO(hoge); x=S; FOR(i,M) hoge[0][i]='0'+min(9,x), x-=min(9,x); if(x>0) return _P("-1 -1\n"); x=S-1; for(i=M-1;i>=0;i--) hoge[1][i]='0'+min(9,x), x-=min(9,x); hoge[1][0]++; _P("%s %s\n",hoge[1],hoge[0]); } int main(int argc,char** argv){ string s;int i; if(argc==1) ios::sync_with_stdio(false); FOR(i,argc-1) s+=argv[i+1],s+='\n'; FOR(i,s.size()) ungetc(s[s.size()-1-i],stdin); solve(); return 0; }
まとめ
C問題の割に簡単。