1.早上一个半小时。
完成了并查集、二叉树、快排题组里的快速排序模板。
【模板】快速排序
P1177 【模板】快速排序 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
先找到一个基准值key,通过一趟排序把待排序序列分为两部分,左边一部分为小于基准值的元素,右边一部分为大于基准值的元素。然后再循环分别对这两部分进行取基准值并排序,所以快速排序实际上是一个递归的过程,可以以此达到使整个序列变为有序序列。但是不知道为什么总是会超时,我开启了O2优化就过了。
代码实现
#include<stdio.h>
int n,a[1000010];
void quicksort(int left,int right)
{
if(left>right)
return;
int i=left;//获取左边、右边和基准数
int j=right;
int t=a[i];
while(i<j)
{
while(i<j&&a[j]>=t)
j--;
if(i<j)
a[i]=a[j];
while(i<j&&a[i]<=t)
i++;
if(i<j)
a[j]=a[i];
}
a[i]=t;
quicksort(left,i-1);//给左边排序
quicksort(j+1,right);//给右边排序
}
int main()
{
void quicksort(int left,int right);
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
quicksort(0,n-1);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
2.下午五个多小时。
今天一天停电,手机给电脑开热点也没电了,只好跑别人家充电,虽然时间学了那么长,但收获到的很少。
看了讲解并查集的视频,做了题组里的并查集模板题,但总是有错误,连输出样例都有问题,反思之后觉得是刚开始学树和并查集,不熟悉,等会再看一遍学长讲树和并查集的视频。
3.晚上两个小时。
CF1416B Make Them Equal - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
因为一直没有思路,连题目都看不懂,第一次测试的最后一题就没有解决。
思路
每组数据经过变换后就等于了每组数据的平均值,如果平均值是整数,就证明可以这样变化,否则不可以。然后先把所有的值放到a[1]里面再均分回去,用均分成1的方法要操作3*(n-1)次。
我尝试了一下用2进行均分,因为我觉得这样会比用1均分快不少,但能力不够,错了。
代码实现
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int a[n+2];
for (int i = 1; i <= n; i++)
cin >> a[i];
int sum = 0;
for (int i = 1; i <= n; i++)
sum += a[i];
int x= sum / n;
if (x*n!=sum)
{
cout << -1 << endl;
continue;
}
cout << 3 * (n - 1) << endl;
for (int i = 2; i <= n; i++)
{
cout << 1 << " " << i << " " << (i - a[i] % i) % i << endl;
cout << i << " " << 1 << " " << (a[i] + (i - a[i] % i) % i) / i << endl;
}
for (int i = 2; i <= n; i++)
{
cout << 1 << " " << i << " " << x<< endl;
}
}
return 0;
}