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