这段时间因为工作轻松一些,所以重新开始打codeforces了。
不过成绩挺让人心寒的。
A.水题,签到
#include<stdio.h>
#include<string.h>
int ab(int x,int y)
{
if(x-y>0) return x;
else return y;
}
int main()
{
int n,a,b;
scanf("%d",&n);
a=1;
b=n;
for(int i=1;i<=n/2;i++)
{
if(n%i==0)
{
int t1,t2;
t1=i;
t2=n/i;
if(ab(t1,t2)<ab(a,b))
{
a=t1<t2?t1:t2;
b=t1<t2?t2:t1;
}
}
}
printf("%d %d\n",a,b);
return 0;
}
B.水题,签到
#include<stdio.h>
#include<string.h>
#define N 300
int main()
{
int n;
char s[N];
while(scanf("%d",&n)!=EOF)
{
scanf("%s",s);
if(n%4!=0)
{
printf("===\n");
continue;
}
int target=n/4;
int t1,t2,t3,t4;
t1=t2=t3=t4=0;
for(int i=0;s[i]!='\0';i++)
{
if(s[i]=='A') t1++;
else if(s[i]=='C') t2++;
else if(s[i]=='G') t3++;
else if(s[i]=='T') t4++;
}
t1=target-t1;
t2=target-t2;
t3=target-t3;
t4=target-t4;
if(t1<0||t2<0||t3<0||t4<0)
{
printf("===\n");
continue;
}
int cnt1,cnt2,cnt3,cnt4;
cnt1=cnt2=cnt3=cnt4=0;
for(int i=0;i<n;i++)
{
if(s[i]=='A')
{
;
}else if(s[i]=='C')
{
;
}else if(s[i]=='G')
{
;
}else if(s[i]=='T')
{
;
}else
{
if(cnt1<t1)
{
s[i]='A';
cnt1++;
}else if(cnt2<t2)
{
s[i]='C';
cnt2++;
}else if(cnt3<t3)
{
s[i]='G';
cnt3++;
}else if(cnt4<t4)
{
s[i]='T';
cnt4++;
}
}
printf("%c",s[i]);
}
printf("\n");
}
return 0;
}
C.记录服务器使用的截止时间。时限比较宽。
#include<stdio.h>
#include<string.h>
#define N 105
int server[N];
int n,q;
int check(int t,int k,int d)
{
int count=0;
for(int i=1;i<=n;i++)
{
if(server[i]<=t)
{
count++;
}
}
if(count<k)
return -1;
int ans=0;
count=0;
for(int i=1;i<=n;i++)
{
if(server[i]<=t)
{
ans+=i;
server[i]=t+d;
count++;
}
if(count==k)
{
return ans;
}
}
return ans;
}
int main()
{
while(scanf("%d%d",&n,&q)!=EOF)
{
memset(server,0,sizeof(server));
for(int i=1;i<=q;i++)
{
int t,k,d;
scanf("%d%d%d",&t,&k,&d);
int ans=check(t,k,d);
printf("%d\n",ans);
}
}
return 0;
}
D.排序,优先填中间的坑,对两头做特殊处理。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 200005
int day[N],minus[N];
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int n,q;
while(scanf("%d%d",&n,&q)!=EOF)
{
int count=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&day[i]);
if(day[i]<0) count++;
}
if(count>q)
{
printf("-1\n");
continue;
}else if(count==0)
{
printf("0\n");
continue;
}
int left=q-count;
int k=0;
int current=0;
day[n+1]=-1;
for(int i=1;i<=n+1;i++)
{
if(day[i]<0)
{
minus[k++]=i-current-1;
current=i;
}
}
qsort(minus+1,k-2,sizeof(minus[0]),cmp);
int ans=0;
for(int i=1;i<k-1;i++)
{
if(minus[i]==0) continue;
if(left>=minus[i])
{
left-=minus[i];
continue;
}
ans+=2;
}
ans+=2;
if(minus[k-1]<=left) ans--;
printf("%d\n",ans);
}
return 0;
}
E.分割字符串,建树。dfs获取树的深度,bfs按层输出。
怎么申请内存让我搞了好久。
输出那部分写的特别丑。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define N 1000005
char s_in[N],temp[N];
char **s;
int edge[N],next[N],head[N],vis[N],stack[N];
int cnt;
struct node
{
int id;
int no;
};
void addEdge(int x,int y)
{
edge[cnt]=y;next[cnt]=head[x];head[x]=cnt++;
return ;
}
int my_spilt()
{
struct node q[N];
int k=1;
int index=0;
int h,t;
s=(char **)malloc(sizeof(char *)*N);
h=t=0;
q[t].id=0;
q[t++].no=N;
int flag=0;
for(int i=0;s_in[i]!='\0';i++)
{
if(s_in[i]!=',')
{
temp[index++]=s_in[i];
}else
{
temp[index]='\0';
if(!flag)
{
s[k]=(char *)malloc(sizeof(char *)*(index+1));
strcpy(s[k],temp);
q[t].id=k;
while(q[t-1].no==0)
t--;
q[t-1].no--;
addEdge(q[t-1].id,k++);
}else
{
int no=atoi(temp);
q[t++].no=no;
}
flag=(flag+1)%2;
index=0;
}
}
return 0;
}
int dfs(int father,int deep)
{
int ans=deep-1;
for(int i=head[father];i!=-1;i=next[i])
{
int son=edge[i];
if(vis[son])
continue;
vis[son]=1;
int temp=dfs(son,deep+1);
ans=temp>ans?temp:ans;
}
return ans;
}
int bfs()
{
struct node q[N];
int h,t;
h=t=0;
q[t].id=0;
q[t++].no=0;
int count=0;
stack[count++]=-1;
int current=0;
while(h!=t)
{
struct node cur=q[h++];
if(cur.no==current+1)
{
stack[count++]=-1;
current++;
}
for(int i=head[cur.id];i!=-1;i=next[i])
{
int son=edge[i];
if(vis[son])
continue;
vis[son]=1;
q[t].id=son;
q[t++].no=cur.no+1;
stack[count++]=son;
}
}
return count;
}
int main()
{
while(scanf("%s",s_in)!=EOF)
{
memset(head,-1,sizeof(head));
memset(next,-1,sizeof(next));
cnt=0;
my_spilt();
memset(vis,0,sizeof(vis));
printf("%d\n",dfs(0,1));
memset(vis,0,sizeof(vis));
int count=bfs();
for(int i=1;i<count;i++)
{
if(stack[i]==-1)
{
for(int j=i-1;j>=0&&stack[j]!=-1;j--)
{
printf("%s ",s[stack[j]]);
}
printf("\n");
}
}
}
return 0;
}