第二天
A. Set of Strings
链接:http://codeforces.com/problemset/problem/544/A
题目大意:
给你一个K和一串字符,然后吧这个字符分成k份,并且每一份的开头字母都不一样
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<queue> using namespace std; #define INF 0xfffffff #define N 200 int main() { char s[N]; int k,i; while(scanf("%d %s",&k,s)!=EOF) { int a[N],vis[30],m=0;///vis表示这个字母是否出现过,a表示不一样的字母的下标 memset(vis,0,sizeof(vis)); for(i=0;s[i];i++) { if(vis[s[i]-'a']==0) { vis[s[i]-'a']=1; a[m++]=i; } } if(k>m) { printf("NO\n"); continue; } printf("YES\n"); m=0; for(i=1;i<k;i++) { for(int j=a[m];j<a[m+1];j++) { printf("%c",s[j]); } printf("\n"); m++; } for(i=a[m];s[i];i++) printf("%c",s[i]); printf("\n"); } return 0; }
B. Sea and Islands
http://codeforces.com/problemset/problem/544/B
题目大意:
给你一个n表示海洋n行n列,然后给你一个K,让你在海洋上加沙滩,看可不可以加k个
如果可以 输出加过的图形(只要符合题目都可以)
分析:
先求出这个图形能加的最多的沙滩有多少个
等差数列求和 公差为-2
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<queue> using namespace std; #define INF 0xfffffff #define N 110 int main() { int n,m,k,i,j; while(scanf("%d %d",&m,&k)!=EOF) { n=(m+1)/2; int S=n*m+n*(n-1)/2*(-2)+(n-1)*(m-2)+(n-1)*(n-2)/2*(-2); if(k>S) { printf("NO\n"); continue; } printf("YES\n"); int ans=0; for(i=0; i<m; i++) { for(j=1; j<=m; j++) { if(ans<k) { if((i%2==0 && j%2==1)||(i%2==1 && j%2==0)) { printf("L"); ans++; } else printf("S"); } else printf("S"); } printf("\n"); } } return 0; }