http://codeforces.com/contest/399
这次排到了room的第一,最后排31,但是它居然告诉我will be unrated!!!本来还指望这次变紫的。。。
A:简单的处理判断问题
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#define ll __int64
using namespace std;
int main()
{
int i,j,k;
int n,m,t,p;
int a[1000];
while(scanf("%d%d%d",&n,&p,&k)!=EOF)
{
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
{
if(i>=p-k&&i<=p+k)
a[i]=1;
}
if(a[1]==1)
{
if(p==1) printf("(1)");
else printf("1");
}
else printf("<<");
for(i=2;i<n;i++)
{
if(a[i]==1)
{
if(p==i) printf(" (%d)",i);
else printf(" %d",i);
}
}
if(a[n]==1)
{
if(p==n) printf(" (%d)",n);
else printf(" %d",n);
}
else printf(" >>");
printf("\n");
}
}
B:水水的找规律
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#define ll __int64
using namespace std;
ll a[60];
void init()
{
a[0]=1;
for(int i=1;i<60;i++)
{
a[i]=a[i-1]<<1;
}
}
int main()
{
int i,j,k;
int n,m,t;
init();
while(scanf("%d",&n)!=EOF)
{
char ch[60];
scanf("%s",ch);
ll sum=0;
for(i=0;i<strlen(ch);i++)
{
if(ch[i]=='B')
sum+=a[i];
}
printf("%I64d\n",sum);
}
}
C:这题想了挺久的,本来想试三分的,但发现不太可行,后来发现根据a进行分x块,那么b就有x+1块,为了使结果最大,a分的结果就是(x-1)个1,剩下一个就是(a-x+1),b分的结果就是(x+1)块相互之间不会相差超过1,然后暴力O(n)一下就行。这题是我这次排名的主要贡献者
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#define ll __int64
using namespace std;
ll a,b;
ll last;
ll cal(ll x)
{
ll cc=0;
cc=(a-x+1)*(a-x+1)+x-1;
ll left=b%(x+1);
ll now=(b/(x+1)+1)*(b/(x+1)+1)*left;
now+=(b/(x+1))*(b/(x+1))*(x+1-left);
cc-=now;
return cc;
}
ll solve(ll n)
{
ll low,high,mid,midmid;
low=1;high=n;
ll mmax=-((ll)1)<<60;
last=-1;
for(ll i=low;i<=high;i++)
{
if(mmax<cal(i))
{
mmax=cal(i);
last=i;
}
}
return mmax;
}
int main()
{
ll i,j,k;
ll n,m,t;
while(scanf("%I64d%I64d",&a,&b)!=EOF)
{
if(b==0)
{
printf("%I64d\n",a*a);
for(i=1;i<=a;i++) printf("o");
printf("\n");
continue;
}
if(b==1)
{
printf("%I64d\n",a*a-1);
for(i=1;i<=a;i++) printf("o");
printf("x\n");
continue;
}
if(a==0)
{
printf("%I64d\n",-b*b);
for(i=1;i<=b;i++) printf("x");
printf("\n");
continue;
}
printf("%I64d\n",solve(min(a,b-1)));
ll x=last;
ll left=b%(x+1);
queue<ll>Q,W;
for(i=1;i<=left;i++)
{
Q.push(b/(x+1)+1);
}
for(i=1;i<=x+1-left;i++)
{
Q.push(b/(x+1));
}
W.push(a-x+1);
for(i=1;i<=x-1;i++)
{
W.push(1);
}
while(!Q.empty())
{
ll now=Q.front();
Q.pop();
for(i=1;i<=now;i++)
{
printf("x");
}
if(!W.empty())
{
now=W.front();
W.pop();
for(i=1;i<=now;i++)
{
printf("o");
}
}
}
printf("\n");
}
}
D:期望题
E:题意大概是叫你制造一棵树出来满足d(x,y)=x,y的最短距离,不知道怎么做。