A题:打印算盘所表示的数,就是分解数的位数,打印印算盘表示的数。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;
void show(int n)
{
if(n==0) puts("O-|-OOOO");
else if(n==1) puts("O-|O-OOO");
else if(n==2) puts("O-|OO-OO");
else if(n==3) puts("O-|OOO-O");
else if(n==4) puts("O-|OOOO-");
else if(n==5) puts("-O|-OOOO");
else if(n==6) puts("-O|O-OOO");
else if(n==7) puts("-O|OO-OO");
else if(n==8) puts("-O|OOO-O");
else puts("-O|OOOO-");
}
int main()
{
__int64 n;
while(scanf("%I64d",&n)!=EOF){
if(n==0){
show(0);
continue;
}
while(n){
int t=n%10;
n/=10;
show(t);
}
}
return 0 ;
}
B题:
求连续k个数的和最小,输出该连续k个数的首位置。
水题:
#include<iostream>
#include<cstdio>
#include<cstring>
typedef __int64 LL;
#define INF 1000000000
using namespace std ;
LL sum[100005];
int main()
{
LL n,k,pos;
LL Min;
sum[0]=0;
while(scanf("%I64d %I64d",&n,&k)!=EOF){
Min=INF;
for(LL i=1;i<=n;i++){
scanf("%I64d",&sum[i]);
if(k==1){
if(sum[i]<Min){
Min=sum[i];
pos=i;
}
}
else sum[i]+=sum[i-1];
}
if(k==1){
printf("%I64d\n",pos);
continue;
}
for( LL i=k;i<=n;i++){
if(Min>(sum[i]-sum[i-k])) {
pos=i-k+1;
Min=sum[i]-sum[i-k];
}
}
printf("%I64d\n",pos);
}
return 0 ;
}
C题:
题意:给出字符串,其中不能连续有大于二个相同的,值能保留两个,如果有连续两的字串都有相同的第二个相同只能保留一个;
比如:abbaaccee-->abbacce. aaalll-->aal
简单的模拟:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;
char st[200005];
int cnt[200005];
void solve(char *s)
{
memset(cnt,0,sizeof(cnt));
printf("%c",s[0]);
int e=0;
int len=strlen(s);
for(int i=1;i<len;i++){
if(s[i]==s[i-1]){
cnt[e]++;
}
else e++;
if(cnt[e]==0) printf("%c",s[i]);
else if(cnt[e]==1&&cnt[e-1]==0) printf("%c",s[i]);
else cnt[e]--;
}
printf("\n");
}
int main()
{
while(scanf("%s",st)!=EOF){
solve(st);
}
}