zoj 2013 Changsha Regional Online Contest C E G H J 题
2013-09-28 11:32
155 查看
题目:C Color
Representation Conversion
直接模拟,注意同类直接的转换。
题目:E Travel
by Bike
注意一下精度,签到题
题目:G Goldbach
当时比赛的写了个n^2的代码,sb了,判断一下去重就 ok
题目:H Hypersphere
矩阵快速幂,读懂题意就好做了
题目:J Candies
先考虑能否通过正向反向求出整个序列,不然的话就贪心,所有i%3==1的未知的在同一时刻取得最大值或者最小值,跟i%3==2的情况相反。
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; }
相关文章推荐
- 2013 ACM/ICPC Asia Regional Changsha Online Contest C
- ZOJ 2013 ACM/ICPC Asia Regional Changsha Online G Goldbach
- zoj 数论之素数 2013 ACM/ICPC Asia Regional Changsha Online - G
- The 2013 ACM-ICPC Asia Changsha Regional Contest C Zoj Collision
- ZOJ 2013 ACM/ICPC Asia Regional Changsha Online E Travel by Bike
- 2013 ACM/ICPC Asia Regional Changsha Online - C Color Representation Conversion
- 数学计数-2013 ACM/ICPC Asia Regional Changsha Online-G 题
- 2013 ACM/ICPC Asia Regional Changsha Online G Goldbach
- 2013 ACM/ICPC Asia Regional Changsha Online - E Travel by Bike
- The 2013 ACM-ICPC Asia Changsha Regional Contest K Pocket Cube
- 2013 ACM/ICPC Asia Regional Changsha Online - I Grand Prix
- 2013 ACM/ICPC Asia Regional Changsha Online J Candies
- The 2013 ACM-ICPC Asia Changsha Regional Contest - A
- The 2013 ACM-ICPC Asia Changsha Regional Contest J Josephina and RPG
- 2013 ACM/ICPC Asia Regional Changsha Online - E Travel by Bike
- 2013 ACM/ICPC Asia Regional Changsha Online-Problem C:Color Representation Conversion(模拟)
- The 2013 ACM-ICPC Asia Changsha Regional Contest - K
- The 2013 ACM-ICPC Asia Changsha Regional Contest
- 2013 ACM/ICPC Asia Regional Changsha Online - J Candies
- 2013 ACM/ICPC Asia Regional Changsha Online Travel by Bike (基础题)