您的位置:首页 > 其它

zoj 2013 Changsha Regional Online Contest C E G H J 题

2013-09-28 11:32 155 查看
题目:C Color
Representation Conversion

直接模拟,注意同类直接的转换。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
const double eps=1e-15;
double r,g,b;
double h,s,l,v;
string str;
double fabs(double tmp)
{
    if(tmp>0)
        return tmp;
    return -tmp;
}
void Converting_HSV_to_RGB()
{

    s/=100.0;
    v/=100.0;
    double c=v*s;
    h/=60.0;
    double hh=h;
    while(hh+eps>=2)
        hh-=2;
    double x=c*(1-fabs(hh-1));
    if(h>=0 &&h<1 )
        r=c,g=x,b=0;
    else if(h<2)
        r=x,g=c,b=0;
    else if(h<3)
        r=0,g=c,b=x;
    else if(h<4)
        r=0,g=x,b=c;
    else if(h<5)
        r=x,g=0,b=c;
    else if(h<6)
        r=c,g=0,b=x;
    else
        r=0,g=0,b=0;
    double m=v-c;
    r+=m,g+=m,b+=m;
    r*=255.0,g*=255.0,b*=255.0;
}
void Converting_HSL_to_RGB()
{
    s/=100.0;
    l/=100.0;
    double c=(1-fabs(2*l-1))*s;
    h/=60.0;
    double hh=h;
    while(hh>=2)
        hh-=2;
    double x=c*(1-fabs(hh-1));
    if(h>=0 &&h<1 )
        r=c,g=x,b=0;
    else if(h<2)
        r=x,g=c,b=0;
    else if(h<3)
        r=0,g=c,b=x;
    else if(h<4)
        r=0,g=x,b=c;
    else if(h<5)
        r=x,g=0,b=c;
    else if(h<6)
        r=c,g=0,b=x;
    else
        r=0,g=0,b=0;
    double m=l-0.5*c;
    r+=m,g+=m,b+=m;
    r*=255,g*=255,b*=255;
}

void Convert_RGB_to_HSL()
{

    r/=255.0,g/=255.0,b/=255.0;
    double mx=max(max(r,g),b);
    double mi=min(min(r,g),b);
    l=0.5*(mx+mi);
    if(mx==mi)
        h=0;
    else if(mx==r && g>=b)
        h=60.0*(g-b)/(mx-mi)+0;
    else if(mx==r && g<b)
        h=60.0*(g-b)/(mx-mi)+360.0;
    else if(mx==g)
        h=60.0*(b-r)/(mx-mi)+120.0;
    else if(mx==b)
        h=60.0*(r-g)/(mx-mi)+240.0;
    if(fabs(l)<eps || mx==mi)
        s=0;
    else if(l>0 && l<=0.5)
        s=(mx-mi)/2.0/l;
    else
        s=(mx-mi)/(2.0-2.0*l);
}
void Convert_RGB_to_HSV()
{

    r/=255.0,g/=255.0,b/=255.0;
    double mx=max(max(r,g),b);
    double mi=min(min(r,g),b);
    if(fabs(mx)<eps)
        s=0;
    else
        s=1-mi/mx;
    v=mx;
    if(mx==mi)
        h=0;
    else if(mx==r && g>=b)
        h=60.0*(g-b)/(mx-mi)+0.0;
    else if(mx==r && g<b)
        h=60.0*(g-b)/(mx-mi)+360.0;
    else if(mx==g)
        h=60.0*(b-r)/(mx-mi)+120.0;
    else if(mx==b)
        h=60.0*(r-g)/(mx-mi)+240.0;
}

int main()
{
    string need;
    while (cin>>need)
    {
        if(need=="RGB")
        {
            cin>>str;
            if(str=="HSL")
            {
                scanf("%lf %lf%% %lf%%",&h,&s,&l);
                Converting_HSL_to_RGB();
                printf("RGB %.lf %.lf %.lf\n",r,g,b);
            }
            else if(str=="HSV")// HSV
            {
                scanf("%lf %lf%% %lf%%",&h,&s,&v);
                Converting_HSV_to_RGB();
                printf("RGB %.lf %.lf %.lf\n",r,g,b);
            }
            else
            {
                cout<<need;
                char sb[1000];
                gets(sb);
                puts(sb);
            }
        }
        else if(need=="HSV")
        {
            cin>>str;
            if(str=="RGB")
            {
                scanf("%lf %lf %lf",&r,&g,&b);
                Convert_RGB_to_HSV();
                printf("HSV %.lf %.lf%% %.lf%%\n",h,s*100,v*100);
            }
            else if(str=="HSL")
            {
                scanf("%lf %lf%% %lf%%",&h,&s,&l);
                Converting_HSL_to_RGB();
                Convert_RGB_to_HSV();
                printf("HSV %.lf %.lf%% %.lf%%\n",h,s*100,v*100);
            }
            else
            {
                cout<<need;
                char sb[1000];
                gets(sb);
                puts(sb);
            }
        }
        else
        { // HSL
            cin>>str;
            if(str=="RGB")
            {
                scanf("%lf %lf %lf",&r,&g,&b);
                Convert_RGB_to_HSL();
                printf("HSL %.lf %.lf%% %.lf%%\n",h,s*100,l*100);
            }
            else if(str=="HSV")
            {
                scanf("%lf %lf%% %lf%%",&h,&s,&v);
                Converting_HSV_to_RGB();
                Convert_RGB_to_HSL();
                printf("HSL %.lf %.lf%% %.lf%%\n",h,s*100,l*100);
            }
            else
            {
                cout<<need;
                char sb[1000];
                gets(sb);
                puts(sb);
            }
        }
    }
    return 0;
}


题目:E Travel
by Bike

注意一下精度,签到题

#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
#define eps 1e-12
string s[7]={"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
int day[7]={8,8,8,8,8,4,4};
int main()
{
    string str;
    while(cin>>str)
    {
        double v,l;
        cin>>l>>v;
        double week=v*(5*8+2*4);
        int now=0;
        for(int i=0;i<7;i++)
            if(s[i]==str)
                now=i;
        int tmp=l/week;
        l-=tmp*week;
        if(l<eps)
        {
            cout<<s[(now+6)%7]<<endl;
            continue;
        }
        while(l-day[now%7]*v>eps)
        {
            l-=day[now%7]*v;
            now++;
            now%=7;
        }
        cout<<s[now%7]<<endl;
    }
    return 0;
}


题目:G Goldbach

当时比赛的写了个n^2的代码,sb了,判断一下去重就 ok

#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
#define maxn 80010
vector<long long>prime;
int add[maxn];
int multi[maxn];
bool vis[maxn];
bool sq(int x)
{
    int sqr=(int)sqrt(x+0.0);
    return sqr*sqr==x ;
}
void init()
{
    memset(add,0,sizeof(add));
    memset(multi,0,sizeof(multi));
    prime.clear();
    memset(vis,true,sizeof(vis));
    vis[0]=vis[1];
    for(int i=2;i<maxn;i++)
        if(vis[i])
        {
            prime.push_back(i);
            for(int j=2*i;j<maxn;j+=i)
                vis[j]=false;
        }
    //printf("%d %d\n",prime.size(),prime[prime.size()-1]);
    for(int i=0;i<prime.size();i++)
        for(int j=i;j<prime.size()&&prime[i]+prime[j]<maxn;j++)
        {
            add[prime[i]+prime[j]]++;
            if(prime[i]*prime[j]<maxn)
                multi[prime[i]*prime[j]]++;
        }
}
int main()
{
    init();
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int ans=0;
        if(vis
) // 由一个素数组成
            ans++;
        ans+=add
;
        ans+=multi
;
        int tmp=0;
        for(int i=0;i<prime.size()&&prime[i]<n;i++)
        {
            ans+=multi[n-prime[i]];//这种情况唯一
            tmp+=add[n-prime[i]]; // 尽量算3遍
            if(prime[i]*3==n)
                tmp+=2; //三个相同素数的和,上面只算了一次,+2
            else if(!((n-prime[i])&1) && vis[(n-prime[i])/2] )
                tmp++; // 两个相同素数的和加一个不同素数,上面算了2次
            if(n%prime[i]==0)
            {
                int cnt=n/prime[i];
                tmp+=multi[n/prime[i]]; // 同上
                if(prime[i]*prime[i]*prime[i]==n)
                    tmp+=2;
                else if(sq(cnt) && vis[int(sqrt(cnt+0.0))])
                    tmp++;
            }
        }
        ans+=tmp/3;
        printf("%d\n",ans);
    }
    return 0;
}


题目:H Hypersphere

矩阵快速幂,读懂题意就好做了

#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
struct Matrix
{
    long long m[3][3];
}E,D;
long long mod;
void init()
{
    for(int i=1;i<=2;i++)
        for(int j=1;j<=2;j++)
            E.m[i][j]=(i==j);
}
Matrix Multi(Matrix A,Matrix B)
{
    Matrix ans;
    for(int i=1;i<=2;i++)
        for(int j=1;j<=2;j++)
        {
            ans.m[i][j]=0;
            for(int k=1;k<=2;k++)
                ans.m[i][j]=(ans.m[i][j]+A.m[i][k]*B.m[k][j])%mod;
        }
    return ans;
}
Matrix Pow(Matrix A,long long k)
{
    Matrix ans=E;
    while(k)
    {
        if(k&1)
        {
            k--;
            ans=Multi(ans,A);
        }
        else
        {
            k/=2;
            A=Multi(A,A);
        }
    }
    return ans;
}
int main()
{
    init();
    long long k,l;
    while(scanf("%lld%lld",&k,&l)!=EOF)
    {
        mod=k;
        Matrix ans;
        ans.m[1][1]=l%mod;
        ans.m[1][2]=l*(l-1)%mod;
        ans.m[2][1]=1;
        ans.m[2][2]=l%mod;
        ans=Pow(ans,k);
        printf("%lld\n",(ans.m[1][1]*2+mod-1)%mod);
    }
    return 0;
}


题目:J Candies

先考虑能否通过正向反向求出整个序列,不然的话就贪心,所有i%3==1的未知的在同一时刻取得最大值或者最小值,跟i%3==2的情况相反。

#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
#define maxn 100010
int a[maxn],b[maxn];
int ans1[maxn],ans2[maxn];
bool ok;
void query()
{
    int m,x;
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d",&x);
        x++;
        if(ok || x%3==0)
        {
            printf("%d\n",a[x]);
        }
        else
        {
            if(x%3==1)
                printf("%d\n",ans1[x]);
            else
                printf("%d\n",ans2[x]);
        }
    }
    return ;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int index=-1;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]!=-1 && i%3!=0)
                index=i;
        }
        a[0]=0,a[n+1]=0;
        ok=false;
        for(int i=1;i<=n;i++)
            scanf("%d",&b[i]);
        for(int i=3;i<=n;i+=3) // 形如a[i%3==0]的项可以全部求出来
            a[i]=b[i-1]-b[i-2]+a[i-3];
        for(int i=n-2;i>=1;i-=3)
            a[i]=b[i+1]-b[i+2]+a[i+3];
        if((n-2)%3==1 || (n-2)%3==2)
        {
            for(int i=1;i<=n;i++)
                if(a[i]==-1)
                    a[i]=b[i]-a[i-1]-a[i+1];
            ok=1;
        }
        if(ok)
        {
            query();
            continue;
        }
        if(index!=-1)
        { // 从index处推出所有的情况
            if(index%3==1)
            {
                a[index+1]=b[index+1]-a[index+2]-a[index];
                for(int i=index+3;i<=n;i++)
                    a[i]=b[i-1]-a[i-2]-a[i-1];
                for(int i=index-1;i>=1;i--)
                    a[i]=b[i+1]-a[i+2]-a[i+1];
            }
            else if(index%3==2)
            {
                for(int i=index+2;i<=n;i++)
                    a[i]=b[i-1]-a[i-2]-a[i-1];
                for(int i=index-1;i>=1;i--)
                    a[i]=b[i+1]-a[i+2]-a[i+1];
            }
            ok=1;
            query();
            continue;
        }
        //不然就只好贪心了
        for(int i=1;i<=n;i++)
        {
            if(a[i]==-1 && a[i+1]==-1 && i%3==1)
                index=i;
        }
        // 当找到连续满足这样的情况时,可以令i%3==1的那个取得尽量大的
        memcpy(ans1,a,sizeof(a));
        ans1[index]=b[index+1]-ans1[index+2];
        ans1[index+1]=0;
        int mx=0;
        for(int i=index+3;i<=n;i++)
        {
            ans1[i]=b[i-1]-ans1[i-2]-ans1[i-1];
            if(i%3==2)
                mx=min(mx,ans1[i]);
        }
        for(int i=index-2;i>=1;i--)
        {
            ans1[i]=b[i+1]-ans1[i+2]-ans1[i+1];
            if(i%3==2)
                mx=min(mx,ans1[i]);
        }
        if(mx<0)
            for(int i=1;i<=n;i+=3)
                ans1[i]+=mx;
        memcpy(ans2,a,sizeof(a));
        ans2[index+1]=b[index+1]-a[index+2];
        ans2[index]=0;
        mx=0;
        for(int i=index+3;i<=n;i++)
        {
            ans2[i]=b[i-1]-ans2[i-1]-ans2[i-2];
            if(i%3==1)
                mx=min(ans2[i],mx);
        }
        for(int i=index-1;i>=1;i--)
        {
            ans2[i]=b[i+1]-ans2[i+1]-ans2[i+2];
            if(i%3==1)
                mx=min(mx,ans2[i]);
        }
        if(mx<0)
            for(int i=2;i<=n;i+=3)
                ans2[i]+=mx;
        query();
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: