2013 ACM/ICPC Asia Regional Changsha Online - C(Color Representation Conversion)、E (Travelby Bi)解题报告

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—>HSL

HSL—>HSV:HSL—>RGBRGB—>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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值