A题:水题,可惜一开始犯糊涂,结果30min才做出来-.-统计下字母出现次数,重新排列,ok
int main(){
int N,flag[27];
char A[1005],B[1005];
while(~scanf("%d",&N)){
scanf("%s",A);
memset(flag,0,sizeof(flag));
int len=strlen(A);
for(int i=0;i<len;i++){
flag[A[i]-'a']++;
}
int i=0;
// printf("%d %d\n",i,flag[i]);
for(i=0;i<26;i++){
if(flag[i]){
if(flag[i]%N!=0) break;
}
}
if(i!=26) printf("-1\n");
else
{
for(i=0;i<N;i++){
for(int j=0;j<26;j++)
if(flag[j]){
for(int m=0;m<flag[j]/N;m++)
printf("%c",j+'a');
}
}
printf("\n");
}
}
}
B题,求p->p-d之间末尾9最多的数,,,,当时用暴力的直接在p~p-d之间的9,,,结果TLE,,,,T_T看了下DS神的代码,,,真是捶胸啊.
我太弱了恨不得撞墙
/*
Problem ID:CF135DIV2B
meaning:求末尾9的最多p-d~p
Analyzing:模拟,暴力会超时
*/
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
using namespace std;
typedef struct even{int y1,y2,x;}even;
#define FOR(i,s,t) for(int i=(s); i<(t); i++)
#define LL long long
#define BUG puts("here!!!")
#define STOP system("pause")
#define file_r(x) freopen(x, "r", stdin)
#define file_w(x) freopen(x, "w", stdout)
const int maxn=500005;
int main(){
LL tail,front,base,cur,ans;
LL p,d;
while(~scanf("%I64d%I64d",&p,&d)){
front=0;
ans=p;
for(int i=0;i<18;i++){
tail=0;
base=1;
for(int j=0;j<i;j++){
tail=tail*10+9;
base*=10;
}
front=p/base;
if(p%base<tail) front--;
cur=front*base+tail;
if(cur>=p-d) ans=cur;
}
printf("%I64d\n",ans);
}
return 0;
}
C题.比赛时没有考虑k==2的特殊情况,水过去了.哎,还好的是没被cha,如果这也算幸运的话.k==2,,怎么处理?看了下学号哥的代码.真是赞,可以记录下A在奇数位和B在偶数位的数量和相反的数量最后结果就是按照大的来!!!
/*
Problem ID:CF135C
meaning:
Analyzing:
*/
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
using namespace std;
typedef struct even{int y1,y2,x;}even;
#define FOR(i,s,t) for(int i=(s); i<(t); i++)
#define LL long long
#define BUG puts("here!!!")
#define STOP system("pause")
#define file_r(x) freopen(x, "r", stdin)
#define file_w(x) freopen(x, "w", stdout)
const int maxn=500005;
int main(){
int n,k;
char a[maxn];
int num,j=0;
while(~scanf("%d%d",&n,&k)){
scanf("%s",a);
num=0;
int cnt1=0,cnt2=0;
if(k==2){
for(int i=0;i<n;i++){
if(i&1){
if(a[i]=='A') cnt1++;
}
else {
if(a[i]=='B') cnt1++;
}
}
for(int i=0;i<n;i++){
if(i&1){
if(a[i]=='B') cnt2++;
}
else {
if(a[i]=='A') cnt2++;
}
}
if(cnt1>cnt2){//A在奇数位上的次数比较多
printf("%d\n",cnt2);
for(int i=0;i<n;i++){
if(i&1) putchar('A');
else putchar('B');
}
}
else {//A在偶数位上的次数比较多
printf("%d\n",cnt1);
for(int i=0;i<n;i++){
if(i&1) putchar('B');
else putchar('A');
}
}
puts("");
}
else {
for(int i=1;i<n;i++){
j=0;
if(a[i]!=a[i-1]) continue;
else if(a[i]==a[i-1]){
while(1){
a[i]=j+'A';
if(a[i]!=a[i-1]&&a[i]!=a[i+1]) break;
j++;
}
num++;
}
}
printf("%d\n",num);
printf("%s\n",a);
}
}
return 0;
}