周三晚上的比赛,掉渣渣了。本来打算紫的,结果挂了两题,掉100分。
现在把题目都A了,发现了一些问题,算是收获吧。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
char str[1000];
int main()
{
int n;
scanf("%d",&n);
char a=0,b=0;
bool flag = true;
for(int i=0;i<n;i++)
{
scanf("%s",str);
if(a==0 && b==0)
a=str[0],b=str[1];
if(a==b) flag=false;
for(int j=0;j<n;j++)
{
if(j==i || i+j==n-1)
{
if(str[j]!=a) flag=false;
}
else if(str[j]!=b)
{
flag=false;
}
}
}
puts(flag?"YES":"NO");
}
B题。正方形跑道,问你每经过d距离后的坐标。很像浮点数取模,不过直接除然后转int再减是不行的,精度问题。可以保留每次在一圈中经过的距离,每次加上d来计算。
附代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
double a,d;
int n;
scanf("%lf%lf%d",&a,&d,&n);
double remain = 0;
for(int i=1;i<=n;i++)
{
double total = remain + d;
int circal = total/(a*4);
remain = total - a*4*circal;
double dis = remain - a*((int)(remain/a));
double x, y;
switch((int)(remain/a))
{
case 0:x=dis,y=0;break;
case 1:x=a,y=dis;break;
case 2:x=a-dis,y=a;break;
case 3:x=0,y=a-dis;break;
}
printf("%.9lf %.9lf\n", x,y);
}
}
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int dis[1000010];
int first[1000010],nxt[1000010],vv[1000010];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
int e=2;
int maxL=0;
for(int i=1;i<=n;i++)
{
int d;
scanf("%d",&d);
maxL = max(maxL, d);
dis[d]++;
nxt[e]=first[d],vv[e]=i,first[d]=e++;
}
if(dis[0]!=1 || (n>1 && dis[1]>k))
{
puts("-1");
return 0;
}
for(int i=2;i<=maxL;i++)
{
if(dis[i]>(long long)(k-1)*dis[i-1])
{
puts("-1");
return 0;
}
}
printf("%d\n", n-1);
for(int ee=first[1];ee;ee=nxt[ee])
{
printf("%d %d\n", vv[first[0]], vv[ee]);
}
for(int i=2;i<=maxL;i++)
{
int aa=first[i-1];
int num=0;
for(int bb=first[i];bb;bb=nxt[bb])
{
printf("%d %d\n", vv[aa], vv[bb]);
num++;
if(num==k-1) num=0,aa=nxt[aa];
}
}
}
初始条件 dp[0][1] = dp[0][0] = 1。一路dp即可。附代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod = 1000000007;
const int maxn = 1111111;
LL dp[maxn][3];
char str[maxn];
int main()
{
scanf("%s",str+1);
int len = strlen(str+1);
dp[0][0] = dp[0][1] = 1;
for(int i=1;i<=len;i++)
{
switch(str[i])
{
case '?':
dp[i][0] = (dp[i-1][0] + dp[i-1][2])%mod;
dp[i][1] = (dp[i-1][0] + dp[i-1][2])%mod;
dp[i][2] = (dp[i-1][1] + dp[i-1][2])%mod;
break;
case '0':
dp[i][0] = dp[i-1][0];
break;
case '1':
dp[i][0] = dp[i-1][2];
dp[i][1] = dp[i-1][0];
break;
case '2':
dp[i][1] = dp[i-1][2];
break;
case '*':
dp[i][2] = (dp[i-1][1] + dp[i-1][2])%mod;
break;
}
}
printf("%d\n", (int)((dp[len][0]+dp[len][2])%mod));
}
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char str[1111111];
char last;
int len;
bool check(int n)
{
int pos=0;
int minp=0;
for(int i=0;i<len;i++)
{
minp = min(minp,pos);
if(str[i]==last)
pos--;
else
pos++;
if(pos==n) pos--;
}
return pos<minp;
}
int main()
{
scanf("%s",str);
len = strlen(str);
last = str[len-1];
int l=1,r=len;
while(l<=r)
{
int m = (l+r)>>1;
if(!check(m))
r = m-1;
else
l = m+1;
}
printf("%d\n", r==len?1:r);
}
CodeForces的确是一个很好的比赛,能提高写代码速度,发现自身问题。以后继续努力变紫吧。