2018七下期中总结&解题报告

前言

好吧,半个学期的模拟赛弱的要死。。。
这篇博客也是应 A J AJ AJ常写博客的要求写的,里面汇聚了半学期总结,文化课成绩和各次模拟赛总分,欢迎点出不足!

新算法

名称 练习题
HASH https://blog.csdn.net/xuxiayang/article/category/7475732
并查集(复习) https://blog.csdn.net/xuxiayang/article/category/7384280
最大匹配 https://blog.csdn.net/xuxiayang/article/category/7569752
离散 https://blog.csdn.net/xuxiayang/article/category/7596185
线段树 https://blog.csdn.net/xuxiayang/article/category/7579490

文化课成绩

科目 分数 班排 级排
语文 105 19 不重要(其实是忘了)\
数学 117 3 不重要
英语 111.5 5 不重要
政治 96 5 不重要
历史 83(砸了) 9 不重要
地理 99 1 2
生物 95 3 不重要
总分 706.5 3 30

总的来说,反正感觉这次考试很玄,进步的几率大约为 30 30% 30,退步可能很大,反正我上次也没考好QAQ

信息学成绩

不算好,不算差
前两次倒数,第三次水了格第一,然后又徘徊在中间。。。
倒数第二一次水了第四还是第五,总之我50分被cena吃了,要不然估计是第三。。。
最后一次水了个T3,据说最难的是第一题
在洛谷上刷了一个比赛,练习了很多题,这半个学期总算把试练场刷到23了

总结

第八周

日期 事件 刷的题
Day 0 星期日 晚自修
Day 1 星期一 讲试卷 模拟赛
Day 2 星期二 讲试卷 快速幂
Day 3 星期三 做题 线段树
Day 4 星期四 讲树状数组
Day 5 星期五 做树状数组 线段树,Stars,Cows
Day 6 星期六 期中模拟赛 Apple Tree和模拟赛的题

期中模拟赛

好吧,这次水了个Rank3。第一题绝对最难

题目

样例有错的第一题。。。
2018七下期中总结&解题报告_第1张图片
2018七下期中总结&解题报告_第2张图片
2018七下期中总结&解题报告_第3张图片
2018七下期中总结&解题报告_第4张图片

正解各种复杂度

题目 时间复杂度 空间复杂度 编程复杂度
第一题 排名 O ( n l o g n ) O(nlogn) O(nlogn) O ( 5 n ) O(5n) O(5n)~ O ( 6 n ) O(6n) O(6n) O ( O( O(玄学 ) ) )
第二题 简写单词 O ( n 3 ) O(n^3) O(n3) O ( n 2 ) O(n^2) O(n2) O ( O( O(简单 ) ) )
第三题 联通块 O ( n 2 + m ) O(n^2+m) O(n2+m) O ( n 2 ) O(n^2) O(n2) O ( O( O(较难 ) ) )
第四题 条形图 O ( n 2 × l e n ) O(n^2\times len) O(n2×len)~ O ( n 3 × l e n ) O(n^3\times len) O(n3×len)取决于三维或二维,len是高精度数组长度 O ( n 2 × l e n ) O(n^2\times len) O(n2×len) O ( O( O(普通 ) ) )

第一题 排名

没有思路
没有大意
玄学破题

代码

#include
#include
#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
using namespace std;int n;
struct node
{
	int chinese,math,english,computer,marank;//不懂英文的可以忽略这些
}a[51];
int read()
{
	char c;int d=1,f=0;
	while((c=getchar())<48||c>57)if(c=='-')d=-1;f=(f<<3)+(f<<1)+c-48;
	while((c=getchar())>=48&&c<=57) f=(f<<3)+(f<<1)+c-48;
	return d*f;
}
bool cmpm(node x,node y){return x.math>y.math;}//排数学成绩
bool cmpc(node x,node y){return x.computer>y.computer;}//排电脑成绩
int main()
{
	n=read();
	for(int i=1;i<=n;i++) {a[i].chinese=read();a[i].math=read();a[i].english=read();a[i].computer=read();}
	sort(a+1,a+1+n,cmpm);
	for(int i=1;i<=n;i++) a[i].marank=i;
	sort(a+1,a+1+n,cmpc);//排序
	for(int i=1;i<=n;i++)
	 printf("%4d%5d%5d%5d%5d%5d \n",a[i].chinese,a[i].math,a[i].english,a[i].computer,a[i].marank,i);//输出
}

第二题 简写单词

大意

给每个单词简写,但不允许是其它单词的前缀

思路

暴力模拟

代码

#include
#include
#include
#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
using namespace std;int n,len=51;string s[51];bool ok;int tf;
string kc;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>s[i];//输入
	string z;
	for(int i=1;i<=n;i++)
	{
		z=kc;//清空
	    for(int j=0;j<s[i].size();j++)
	    {
	    	z+=s[i][j];tf=0;//先加上
	    	for(int k=1;k<=n;k++)
	    	{
	    		if(i==k) continue;
	    		if(s[k].find(z)==0) {tf=1;break;}//查找,判断
			}
			if(!tf) {cout<<z<<endl;break;}//输出简化后的单词
	    }
	}
}

第三题 联通块

大意

若相邻的颜色相同的格子视为一个联通块,求每次涂色后联通快的个数

思路

终于来并查集了
一波并查集判断轻松AC

代码

#include
#define k(i,j) (i-1)*n+j//降维
#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
using namespace std;int n,m,f[250001],b[501][501],x,i,j,ans,p,q;
const short dx[4]={-1,0,1,0};
const short dy[4]={0,1,0,-1};//四个方向
int read()
{
	char c;int d=1,f=0;
	while((c=getchar())<48||c>57)if(c=='-')d=-1;f=(f<<3)+(f<<1)+c-48;
	while((c=getchar())>=48&&c<=57) f=(f<<3)+(f<<1)+c-48;
	return d*f;
}
void write(int x)
{
	if(x>9) write(x/10);putchar(x%10+48);
}
void writeln(int x)
{
	write(x);putchar(10);
}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void judge(int x,int y){f[find(x)]=find(y);return;}
bool check(int x,int y){return find(x)==find(y);}//并查集
int main()
{
	n=read();m=read();
	for(int i=1;i<=n*n;i++) f[i]=i;
	while(m--)
	{
		x=read();i=read();j=read();x++;ans++;//因为数组初始是0,所以把它+1就可以避免初始化
		for(int l=0;l<4;l++)
		{
			p=i+dx[l];q=j+dy[l];
			if(p<1||q<1||p>n||q>n) continue;//爆范围返回
			if(b[p][q]!=x) continue;//颜色不同返回
			if(check(k(p,q),k(i,j))) continue;//已连接返回
			judge(k(p,q),k(i,j));ans--;//连一条少一个联通块
		}
		b[i][j]=x;//赋值
		writeln(ans);//输出
	}
}

第四题 条形图

大意

一个矩阵,第一行最多放 n n n个*,第二行最多 n − 1 n-1 n1,以此类推,设下行的*必须比上行少,求方案数

思路

dp
f [ i ] [ j ] f[i][j] f[i][j]表示计算到第 i i i行第 j j j个时的方案数,轻松得出动态转移方程
f [ i ] [ j ] = f [ i − 1 ] [ j ] + f [ i ] [ j − 1 ] f[i][j]=f[i-1][j]+f[i][j-1] f[i][j]=f[i1][j]+f[i][j1]
最后把所有的 f [ n ] [ i ] f[n][i] f[n][i]加在一起即为答案
注意:数据很大,要用高精度

代码

#include
#include
#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
using namespace std;int n,ans[61],f[101][101][61];
void newmain()
{
	int g=0,h=0;
	for(int i=1;i<=n;i++)
	{
		f[i][0][60]=1;//记得初始化
	 	for(int j=1;j<=i;j++)
	 	{
	 		g=0;
		 	for(int k=60;k>0;k--)
		 	{
		 		f[i][j][k]=(f[i-1][j][k]+f[i][j-1][k]+g)%10;
		 		g=(f[i-1][j][k]+f[i][j-1][k]+g)/10;//高精度
		 	}
		}
    }
    g=0;
    for(int i=1;i<=n;i++)
     for(int k=60;k>0;k--)//最后一行加起来
     {
     	h=ans[k]+f[n][i][k]+g;
     	ans[k]=h%10;
     	g=h/10;
     }
    int j=1;
    while(!ans[j]) j++;
    for(int i=j;i<=60;i++)   putchar(ans[i]+48);//输出
}
int main()
{
	scanf("%d",&n);
	if(n==1) printf("1");else
	if(n==2) printf("4");else
	if(n==3) printf("13");else
	if(n==4) printf("41");else
	if(n==5) printf("131");else
	if(n==6) printf("428");else
	if(n==7) printf("1429");else
	if(n==8) printf("4861");else
	if(n==9) printf("16795");else
	if(n==10)printf("58785");else
	if(n==11)printf("208011");else
	if(n==12)printf("742899");else
	if(n==13)printf("2674439");else
	if(n==14)printf("9694844");else
	if(n==16)printf("129644789");else
	if(n==17)printf("477638699");else//哈,你问我为什么打表,因为我不想删之前深搜打出来的规律。。。
	if(n==18)printf("1767263189");else{newmain();return 0;}
}

#尾声
这半个学期来,学习到了许多新知识,做了许多题。总的感觉有喜有悲,在我们这一届的相互帮助下,我们都有了很大的提升,特别是我们的dalao——WYC同学在 G D O I GDOI GDOI成功虐题
帮他打个广告:
GDOI2018《被虐记》
https://blog.csdn.net/mr_wuyongcong/article/details/80210617
最后希望在剩下半个学期继续努力,拿到更好的成绩!
##最后附图
2018七下期中总结&解题报告_第5张图片

你可能感兴趣的:(总结,解题报告,dp,并查集,OI生涯)