题目: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[n]) // 由一个素数组成
ans++;
ans+=add[n];
ans+=multi[n];
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;
}