Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1287 Accepted Submission(s): 604
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; int t,n,cnt; long long st[500005],p,r; long long p2[500005],p3[500005],p5[500005],p7[500005]; int main() { scanf("%d",&t); r=1; p2[0]=r; for(int i=1;i;i++) { if(r>1e9)break; r*=2; p2[i]=r; } r=1; p3[0]=r; for(int i=1;i;i++) { if(r>1e9)break; r*=3; p3[i]=r; } r=1; p5[0]=r; for(int i=1;i;i++) { if(r>1e9)break; r*=5; p5[i]=r; } r=1; p7[0]=r; for(int i=1;i;i++) { if(r>1e9)break; r*=7; p7[i]=r; } cnt=0; for(int i=0;i<=31;i++) { for(int j=0;j<=19;j++) { for(int k=0;k<=12;k++) { for(int v=0;v<=11;v++) { p=p2[i]*p3[j]; if(p>1e9)break; st[++cnt]=p; if(p<1e9) { p*=p5[k]; if(p>1e9)break; st[++cnt]=p; } else break; if(p<1e9) { p*=p7[v]; if(p>1e9)break; st[++cnt]=p; } } } } } sort(st+1,st+cnt+1); while(t--) { scanf("%d",&n); printf("%lld\n",*lower_bound(st+1,st+cnt+1,n)); } return 0; }
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1783 Accepted Submission(s): 568
这题可以找规律发现到某一点往上至正无穷大,数值都不会变,然后就好做啦~只需要处理前几十万个。
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; string n; long double sum[400005]; int main() { sum[0]=(long double)0.0; for(int i=1;i<=400000;i++) { sum[i]=sum[i-1]+(long double)1.0/(long double)i/(long double)i; } while(cin>>n) { if(n[0]==‘-‘)n[0]=‘0‘; long long p=0; bool f=0; for(int i=0;i<n.size();i++) { p=p*10+n[i]-48; if(p>400000) { printf("%.5f\n",(double)sum[400000]); f=1; break; } } if(f==0) { printf("%.5f\n",(double)sum[p]); } } return 0; }
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 435 Accepted Submission(s): 377
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; int t,n; int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); if(n%2==0)cout<<"Bad"<<endl; else cout<<"Balanced"<<endl; } return 0; }
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1155 Accepted Submission(s): 515
裸的一笔画问题,判欧拉回路与欧拉通路两种与连通性。
欧拉通路没啥好说的,首尾点固定,路线固定。
欧拉回路,即环。值是不定的,要求最大,即将必须通过的点XOR,再枚举开头初始点,与之前ans进行XOR,比最值。
不是一笔画即Impossible。
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<set> using namespace std; int t,n,m,x,y,ans,p,cnt; int a[100005],sum[100005],par[100005]; int find(int x) { if(x==par[x])return x; else return par[x]=find(par[x]); } void unionx(int x,int y) { x=find(x); y=find(y); if(x==y)return ; par[x]=y; } int main() { scanf("%d",&t); while(t--) { for(int i=1;i<=n;i++)par[i]=i; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); memset(sum,0,sizeof(sum)); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); unionx(x,y); sum[x]++; sum[y]++; } cnt=0; for(int i=1;i<=n;i++) { if(i==par[i] && sum[i]!=0)cnt++; } if(cnt>1) { cout<<"Impossible"<<endl; continue; } p=0; ans=0; for(int i=1;i<=n;i++) { if(sum[i]==0)continue; if(sum[i]%2==1)p++; ans^=(((sum[i]+1)/2)%2)*a[i]; } if(p!=0 && p!=2) { cout<<"Impossible"<<endl; continue; } if(p==2) { printf("%d\n",ans); continue; } else { int anss=0; for(int i=1;i<=n;i++) { if(sum[i]==0)continue; anss=max(anss,ans^a[i]); } printf("%d\n",anss); } } return 0; }
先只看了几道通过率高的题A了,剩余的题如果还有A的,且心情好的话再补上。。。
毕竟之前两天辣么的题目都没挂上来。原因。。。文化课掉出年级250外了。。。
2016 ACM/ICPC Asia Regional Qingdao Online(2016ACM青岛网络赛部分题解)
原文:http://www.cnblogs.com/winmt/p/6284391.html