SRM 189 DIV1 Easy - Display (復習○)

問題


http://community.topcoder.com/stat?c=problem_statement&pm=2295&rd=4765

縦横が-10^6~10^6の間にあるx、y座標上の点を、
0~10^3の座標上に変換したい。
このとき、変換後の座標を求める。

解き方


Exampleを見るとx,y座標それぞれに対して
最小の数を0になるよう足し引きして、その後最大の座標が1000になるよう縮尺してあげればよい。

システムテストで落ちないように以下の四則演算には注意。

・最後に0.5単位の数を繰り上げる際には、掛け算をしてから割り算をする。
・0になるよう足し引きする際は、最小が+-のときどのような操作になるかを
 手書きで確かめてから実装する。

コード


using namespace std;

#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()

class Display {

public: vector<string> transform(vector<int> x, vector<int> y) {
int n=x.size();

int minx=1e+9,miny=1e+9;
FORE(i,0,n){
minx=min(minx,x[i]);
miny=min(miny,y[i]);
}

int maxx=-1,maxy=-1;
FORE(i,0,n){
x[i]-=minx;
y[i]-=miny;
maxx=max(maxx,x[i]);
maxy=max(maxy,y[i]);
}

FORE(i,0,n){
x[i]=(int)((double)x[i]*1000/maxx+0.5);
y[i]=(int)((double)y[i]*1000/maxy+0.5);
}

vector<string> ans;
FORE(i,0,n){
char ch[20];
sprintf(ch,"%d %d",x[i],y[i]);
ans.push_back(ch);
}

return ans;
}

};

using namespace std;

#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()

class Display {

public: vector<string> transform(vector<int> x, vector<int> y) {
int n=x.size();
vector<string> ans;

int minx=x[0],maxx=x[0],miny=y[0],maxy=y[0];
FORE(i,0,n){
minx=min(minx,x[i]);
maxx=max(maxx,x[i]);
miny=min(miny,y[i]);
maxy=max(maxy,y[i]);
}
maxx-=minx,maxy-=miny;

FORE(i,0,n){
char ch[30];
x[i]=((x[i]-minx)*1000.0)/(double)maxx+0.5;
y[i]=((y[i]-miny)*1000.0)/(double)maxy+0.5;
sprintf(ch,"%d %d",x[i],y[i]);
ans.push_back(ch);
}

return ans;
}

};
このエントリーをはてなブックマークに追加