由于本周六请假返乡就医(暂缓返校),学习时间会减少,返校日期定不下来,这次博客是在泰安站候车时与在火车上写的。
选修acm程序设计基础也已经两个多月了,虽然由于精力和时间问题导致学习时间很少,但是我也渐渐养成了看博客、翻资料的习惯,其实我也把其他事情全放掉,一心学习acm,但是我的外语语种几乎断了我继续学acm的路,我的外语是日语,英语一窍不通,现在打codeforces题目是完全看不懂的,翻译软件在翻译的时候也总会有各种各样的翻译错误,导致我每次读题时间比别人多好几倍,如果以后正式打比赛更没有翻译软件了,那连题都读不懂更不用说要打比赛拿名次了,所以我还是同时把精力放到了别的上面。
当然,既然已经学了这么长时间的acm了,肯定不能轻易就放弃,还是要继续学下去,最起码把本学期和课认认真真学下去,虽然由于语种问题无法打比赛,但是学习思维、知识、学习方法也是颇有收获。
本周学的不多,精力分散是一个原因,主要原因是从上周开始感觉学习起来挺吃力的,也不仅仅只有这一门,其他科目学起来也渐渐感到吃力了,然后周四去看心理医生,疏导了一下。本周把kruskal算法啃下来了,然后其他的学习主要还是以看博客为主,晚上只要有时间就做洛谷,博客看了并查集、拓扑排序和kruskal算法的例题;prim算法的题目我也看了,看不懂。
周二的codeforces,由于是div.4,前几道题挺简单的
A. Lucky?这个签到题的意思是,给出一个六位数的数字,求前三位数的和是否等于后三位数的和,是输入yes,否输入no,这个题的唯一难度在于如何提取每一位的数,当然方法很多,我有两种方法:第一种是定义一个char类型的数组,输入后将每一个元素都减去“0”的ASCII码,得到实际数字,然后开始判断是否满足条件;第二种方法是直接输入int类型数字,定义变量名为a,然后提取个位(a%10),提取十位(a/10%10),提取百位(a/100%10),以此类推,直至求出所有位,然后开始判断即可,这个题我用了4分钟就ac了,是我a的最快的一道题
B. Equal Candies这个题的意思是,有n盒糖,每盒糖的数量都不一样,在取出最少的糖的要求下使得每盒糖的数量都一样。其实实现起来也很简单,首先找出n盒糖中最少的一盒有多少糖,然后让每盒糖都减去比最少的一盒多的糖,将这些多出来的糖加起来就是所求的答案。我甚至感觉B题比A题更简单。
C. Most Similar Words从C题开始就有一点难度了,这个题的意思是:给出好多个字符串,按照26个字母的顺序,字母顺序离得越近,就代表越相似,比如说:a和c离着2,就是a变成c需要a-b-c两步,再比如说,h和q离着9,就是h-i-j-k-l-m-n-o-p-q九步,题中给出n个字符串,每个字符串的长度都一样,此时求其中两个离得最近的字符串距离多远,也就是说如何用最小步数将一个字符串变成另外一个字符串,这个题我没有A掉,我是这样做的:
首先输入字符串,并且按照每个字符(a=1,b=2......z=26)这样的要求去将每个字符所代表的数字加起来,然后判断找出n个字符串中两个数字最为相似的,去这两个数字的差输出。当然,我这个做法是错误的,经过我再次修改,这次我定义了一个二维数组,存储字符串,也就是说将所有字符全存在一起,然后遍历n行字符串的每一横的差,时间复杂度为On2,由于题中表示输入的字符串不多,所以就不用担心超时问题,使每一行字符串与其余所有字符串都比较计算之后,求出其中的最小值,并输出,这次给出的例字可以运行了,但还是没有ac。
#include<iostream>
using namespace std;
char a[50][50];
int b[50];
int main() {
int t;
cin >> t;
for (int q = 1; q <= t; q++) {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int index = 0;
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
index += a[i][j];
}
b[i] = index;
}
int minn = 1000000;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i != j) {
if (abs(b[i] - b[j]) <= minn) {
minn = abs(b[i] - b[j]);
}
}
}
}
cout << minn << endl;
}
}
关于最小生成树,kruskal算法还是更适合我,就是定义结构体存起点终点和路程,然后根据路程排序,再定义一个并查集存储祖宗,定义函数,先根据路程排序,然后记录路程并把该起点终点连通,最终得题意中所需的答案
void kruskal()
{
sort(edge,edge+m,cmp);
for(int i=0;i<m;i++)
{
eu=find(edge[i].u), ev=find(edge[i].v);
if(eu==ev)continue;
ans+=edge[i].w;
fa[ev]=eu;
if(++cnt==n-1)break;
}
}