2013 ACM/ICPC Asia Regional Changsha Online - C Color Representation Conversion
考查:耐心、细心、基础能力
看懂题目就不成问题了,另外就只有公式装换和精度处理了。
题目给出四个转换公式:
HSV—>RGB
HSL—>RGB
RGB—>HSV
RGB—>HSL
我们要做到的装换模式有 6 种,转换模式方式如下:
HSV—>RGB:直接装换
HSL—>RGB:直接装换
RGB—>HSV:直接转换
RGB—>HSL:直接转换
HSV—>HSL:HSV—>RGB、RGB—>HSLHSL—>HSV:HSL—>RGB、RGB—>HSV
#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<math.h> using namespace std; double G,R,B,H,Shsv,V,Shsl,L; double g,r,b; double c,x,m,min1,max1; double h1; void HSVtoRGB() //不解释,就是HSV模式的表示法装换成RGB的表示法 { c=V*Shsv*0.0001; h1=(double)H/60; double p=h1-((int)h1/2*2)-1; if(p<0)p=-p; x=c*(1-p); if(h1<0)R=0,G=0,B=0; else if(h1<1)r=c,g=x,b=0; else if(h1<2)r=x,g=c,b=0; else if(h1<3)r=0,g=c,b=x; else if(h1<4)r=0,g=x,b=c; else if(h1<5)r=x,g=0,b=c; else if(h1<6)r=c,g=0,b=x; m=V*0.01-c; r+=m; g+=m; b+=m; r*=255; g*=255; b*=255; R=r; G=g; B=b; } void HSLtoRGB() //同上 { double q=2*L*0.01-1; if(q<0)q=-q; c=(1-q)*Shsl*0.01; h1=(double)H/60; double p=h1-((int)h1/2*2)-1; if(p<0)p=-p; x=c*(1-p); if(h1<0)R=0,G=0,B=0; else if(h1<1)r=c,g=x,b=0; else if(h1<2)r=x,g=c,b=0; else if(h1<3)r=0,g=c,b=x; else if(h1<4)r=0,g=x,b=c; else if(h1<5)r=x,g=0,b=c; else if(h1<6)r=c,g=0,b=x; m=L*0.01-c*0.5; r+=m; g+=m; b+=m; r*=255; g*=255; b*=255; R=r; G=g; B=b; } void RGBtoHSV() //同上 { double h,v,s; r=(double)R/255; g=(double)G/255; b=(double)B/255; max1=r>b?r:b; max1=max1>g?max1:g; min1=r<b?r:b; min1=min1<g?min1:g; if(max1==min1)h=0; else if(max1==r&&g>=b)h=60*(g-b)/(max1-min1); else if(max1==r&&g<b)h=60*(g-b)/(max1-min1)+360; else if(max1==g)h=60*(b-r)/(max1-min1)+120; else if(max1==b)h=60*(r-g)/(max1-min1)+240; H=h; if(max1==0)s=0; else s=1-min1/max1; s*=100; Shsv=s; max1*=100; V=max1; } void RGBtoHSL() //同上 { double h,l,s; r=(double)R/255; g=(double)G/255; b=(double)B/255; max1=r>b?r:b; max1=max1>g?max1:g; min1=r<b?r:b; min1=min1<g?min1:g; if(max1==min1)h=0; else if(max1==r&&g>=b)h=60*(g-b)/(max1-min1); else if(max1==r&&g<b)h=60*(g-b)/(max1-min1)+360; else if(max1==g)h=60*(b-r)/(max1-min1)+120; else if(max1==b)h=60*(r-g)/(max1-min1)+240; H=h; l=(max1+min1)*0.5; if(l==0||max1==min1)s=0; else if(l>0&&l<=0.5)s=(max1-min1)/(2*l); else if(l>0.5)s=s=(max1-min1)/(2-2*l); l*=100; L=l; s*=100; Shsl=s; } int main() { string s,e; while(cin>>e) //输入目标模式名称 { cin>>s; //输入转换前模式名字(不同模式输入格式不一样) if(s=="RGB") { cin>>R>>G>>B; if(e=="HSL") { RGBtoHSL(); cout<<e; printf(" %.0lf %.0lf%% %.0lf%%",H,Shsl,L); } else if(e=="HSV") { RGBtoHSV(); cout<<e; printf(" %.0lf %.0lf%% %.0lf%%",H,Shsv,V); } else cout<<e,printf(" %.0lf %.0lf %.0lf",R,G,B); } else if(s=="HSL") { scanf("%lf%lf%%%lf%%",&H,&Shsl,&L); if(e=="RGB") { HSLtoRGB(); cout<<e; printf(" %.0lf %.0lf %.0lf",R,G,B); } else if(e=="HSV") { HSLtoRGB(); RGBtoHSV(); cout<<e; printf(" %.0lf %.0lf%% %.0lf%%",H,Shsv,V); } else cout<<e,printf(" %.0lf %.0lf%% %.0lf%%",H,Shsl,L); } else { scanf("%lf%lf%%%lf%%",&H,&Shsv,&V); if(e=="RGB") { HSVtoRGB(); cout<<e; printf(" %.0lf %.0lf %.0lf",R,G,B); } else if(e=="HSL") { HSVtoRGB(); RGBtoHSL(); cout<<e; printf(" %.0lf %.0lf%% %.0lf%%",H,Shsl,L); } else cout<<e,printf(" %.0lf %.0lf%% %.0lf%%",H,Shsv,V); } cout<<endl; } return 0; }
2013 ACM/ICPC Asia Regional Changsha Online - ETravelby Bike
没什么好说的,轮圈来吧!要是够跑一周的,先跑,后面再把尾数处理下就好了。一天天轮的话,不保证不超时。
不说多了,上代码吧!
#include<iostream> #include<cstdio> #include<string> using namespace std; struct node //一周之类每天的信息 { string day; //时间标记 int time; //工作时间 }bick[7]={"Monday",8,"Tuesday",8,"Wednesday",8,"Thursday",8,"Friday",8,"Saturday",4,"Sunday",4}; int main() { string s; int L; double speed,sumtime; int day; int i,j; while(cin>>s>>L>>speed) { for(i=0;i<7;i++) if(s==bick[i].day)break; day=i; sumtime=(double)L/speed; if((int)sumtime>=48) sumtime-=(int)sumtime/48*48; //每周可以工作48小时 if(sumtime==0) //刚好n周走完 { day=i-1; if(day<0)day=6; } else while(sumtime>0) //剩余时间,论坛提算 { if(day>6)day=0; sumtime-=bick[day].time; if(sumtime<=0)break; day++; } cout<<bick[day].day<<endl; //直接输出对应日子标记 } return 0; }