Codeforces Round #211

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);
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章