写在前面
我的第八篇博客,小白书第三章:数组和字符串,习题.
题目在uva上,用了一个不是很稳的vpn,计时做题.
1. Score (Uva 1585) 模拟
T组数据,每组80个字符’O’或’X’,输出每组的得分.得分定义为若’O’是连续的第k个’O’,记k分.
#include <cstdio>
#include <cstring>
char s[100];
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
int tmp=0,ans=0;
for(int i=0;i<strlen(s);i++)
{
if(s[i]=='X')
tmp=0;
else
{
tmp++;
ans+=tmp;
}
}
printf("%d\n",ans );
}
return 0;
}
AC时间 5分钟.
2. Uva 1586 - Molar mass (模拟)
输入t组只有CHON的分子式,求分子量.数字不超过99.
#include <bits/stdc++.h>
char s[200];
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
double now=0.0,ans=0.0;
int ti1=0,ti2=0;
for(int i=0;i<strlen(s);i++)
{
if(isalpha(s[i]))
{
if(ti1==0&&ti2==0) ti2=1;
ans+=now*(ti1*10+ti2);
ti1=ti2=0;
switch(s[i])
{
case 'C':now=12.01;break;
case 'H':now=1.008;break;
case 'O':now=16.00;break;
case 'N':now=14.01;break;
}
}
else if(ti2==0)
{
ti2=s[i]-'0';
}
else
{
ti1=ti2;
ti2=s[i]-'0';
}
}
if(ti1==0&&ti2==0) ti2=1;
ans+=now*(ti1*10+ti2);
printf("%.3f\n",ans );
}
return 0;
}
AC时间:13分钟.感觉逻辑有点混乱了.
3. Uva 1225 - Digit Counting
t组数据,每组给出一个10000以内的正整数n,输出从1数到n的过程中每个数字(0-9)出现了几次.
#include <bits/stdc++.h>
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
int a[10]={},n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int tmp=i;
while(tmp)
{
a[tmp%10]++;
tmp/=10;
}
}
for(int i=0;i<=8;i++)
printf("%d ",a[i] );
printf("%d\n",a[9] );
}
return 0;
}
AC时间6分钟,uva很看重格式,多一个空格也会PE.
4. uva 455 - Periodic Strings 周期串
t组数据,每组读入一个字符串(80)求其最小周期.
枚举即可.
8月31日修改:使用了新做的板子,简洁明了
#include <bits/stdc++.h>
char s[10000];
template <typename T>int cycle(T *s, int n)
{
int xx = n / 2 + 1;
for(int ans = 1; ans <= xx; ans++)
{
if(n % ans) continue;
for(int x = ans; x < n; x += ans)
for(int i = 0; i < ans; i++)
if(s[x + i] != s[i])
goto pp;
return ans;
pp:;
}
return n;
}
int main(void)
{
int t;
scanf("%d", &t);
for(int k = 0; k < t; k++)
{
scanf("%s", s);
int ans=cycle(s,strlen(s));
if(k != 0)
printf("\n");
printf("%d\n", ans );
}
return 0;
}
5. uva 227 - Puzzle 模拟
t组数据,每组输入5x5的字符,其中有一个空格.然后一连串操作后接一个数字0表示操作结尾,输出操作的执行结果.最后是一个Z表示结束.
#include <bits/stdc++.h>
using namespace std;
char save[6][6],op[20000];
int pp[2][4]={{-1,1,0,0},{0,0,-1,1}};
int main(void)
{
for(int idx=1;idx<=20000;idx++)
{
int flag=1,keyx,keyy;
for(int i=0;i<5;i++)
{
int j=-1;
do
{
j++;
save[i][j]=getchar();
if(save[0][0]=='Z')
return 0;
if(save[i][j]==' ')
keyx=i,keyy=j;
}
while(save[i][j]!='\n');
if(j==4)
{
save[i][4]=' ';
keyx=i,keyy=4;
}
}
if(idx!=1) printf("\n");
char op;
while(1)
{
op=getchar();
if(op=='\n') continue;
if(op=='0') break;
int ps=0;
switch(op)
{
case 'A':ps=0;break;
case 'B':ps=1;break;
case 'L':ps=2;break;
case 'R':ps=3;break;
}
int nex=keyx+pp[0][ps],ney=keyy+pp[1][ps];
if(flag==1&&nex>=0&&nex<=4&&ney>=0&&ney<=4)
{
swap(save[keyx][keyy],save[nex][ney]);
keyx=nex,keyy=ney;
}
else
flag=0;
}
getchar();
printf("Puzzle #%d:\n",idx );
if(flag)
for(int i=0;i<5;i++)
{
for(int j=0;j<4;j++)
printf("%c ",save[i][j]);
printf("%c\n",save[i][4]);
}
else
printf("This puzzle has no final configuration.\n");
}
return 0;
}
代码用时,一个小时.各种改bug
睡觉,明天起来继续.