1.早上两个半小时
完成了二叉树、并查集、快排题组的修复公路题。
P1111修复公路
P1111 修复公路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
先将时间进行升序排列,然后从头开始遍历,如果到某一组数据的时候,树的结点个数与村子树相同时,这组数据的时间就是最短时间,如果到最后树的结点个数仍不等于村子数,就输出-1。
代码实现
#include<stdio.h>
typedef struct node//因为要总体进行交换,所以最好用结构体数组存数据
{
int x,y,t;
} Node;
Node a[100001];
int n,m,parent[1001],sum;
int find(int u)//找根结点
{
if(u!=parent[u])
parent[u]=find(parent[u]);
return parent[u];
}
void quicksort(int left,int right)//快排,对时间进行升序排列
{
if(left>right)
return;
int i=left;
int j=right;
Node x=a[left];
while(i<j)
{
while(a[j].t>=x.t&&i<j)
j--;
a[i]=a[j];
while(a[i].t<=x.t&&i<j)
i++;
a[j]=a[i];
}
int y=j;
a[y]=x;
quicksort(left,y-1);
quicksort(y+1,right);
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1; i<=n; i++)
parent[i]=i;
for(int i=0; i<m; i++)
scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].t);
quicksort(0,m-1);
for(int i=0; i<m; i++)
{
int p1=find(a[i].x);
int p2=find(a[i].y);
if(p1!=p2)
{
parent[p1]=p2;
sum++;
}
if(sum==n-1)//遍历到某组元素时,如果树的元素与村子数相等,直接输出这个时间
{
printf("%d\n",a[i].t);
return 0;
}
}
printf("-1");//否则就输出-1
return 0;
}
2.下午三个半小时
完成了第二周测试的两个题目。
CF922A Cloning Toys
CF922A Cloning Toys - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
就是根据两个的关系式x=i*2+j与y=j+1,x是克隆体的数量,y是本体的数量,i是克隆体的克隆的次数,j是本体克隆的次数。
代码实现
#include<stdio.h>
int main()
{
long long x,y;
scanf("%lld %lld",&x,&y);
if((x-y+1)%2==0&&x>=1&&y>=2&&(x-y)>=-1)//根据本体的数量的关系式和克隆体的数量的关系式可以得到
printf("Yes");
else if(x==0&&y==1)
printf("Yes");
else if(y==0)
printf("No");
else
printf("No");
return 0;
}
P7939 [B1]Alice Wins!(easy version)
P7939 [B1] Alice Wins! (easy version) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
因为题目规定可以改a[],b[]数组里面个n个,所以就前n个先改a[]数组里的,后n个改b[]数组里的。
代码实现
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,a[200001],b[200001],sum=0,ans=0;
scanf("%d",&n);
for(int i=0;i<2*n;i++)
scanf("%d",&a[i]);
for(int i=0;i<2*n;i++)
scanf("%d",&b[i]);
for(int i=0;i<n;i++)//前n个改a[]数组里的
{
if(b[i]==1&&a[i]!=3)
a[i]=3;
if(b[i]==2&&a[i]!=1)
a[i]=1;
if(b[i]==3&&a[i]!=2)
a[i]=2;
}
for(int i=n;i<2*n;i++)//后n个改b[]数组里的
{
if(a[i]==1&&b[i]!=2)
b[i]=2;
if(a[i]==2&&b[i]!=3)
b[i]=3;
if(a[i]==3&&b[i]!=1)
b[i]=1;
}
printf("%d\n",2*n);
for(int i=0;i<2*n;i++)
printf("%d ",a[i]);
printf("\n");
for(int i=0;i<2*n;i++)
printf("%d ",b[i]);
printf("\n");
}
return 0;
}
3.晚上两个小时。
就答辩,看了自己一周以来刷的题目,以及记的笔记,写的每日总结。