首页 > 技术文章 > 1.25日考试

KSTT 2019-01-25 17:17 原文

错因分析

◊思考不细致,对题目有为畏难情绪,例如今天第一题,我一看到题目就不想去思考,草率的打了一个特别不靠谱的方法就停止了,后面知道自己错了都没有时间了,因为我已经被别的题目搞的头晕脑涨了

◊做题不严谨,今天的T3和T4,我都有很多小细节上的错误,忘了判重,for循环的漏洞,都让我耗费了很久的时间,所以下次敲题目时要注意

那些细枝末节,想清楚以后在答题,比乱打一气要少花很多时间

◊学会给题目分类,看到一个题目,我们要试图去分析它所考察的点是什么,这样的话你可以更快的想到处理解决的方法,例如

今天T3,考的图论,那么脑袋里就要浮现出图论的知识怎么储存,怎么处理....

还有T4,知道考察的是DP就要列出状态和转移方程....

学习方法

◊好开心,我又从GQL大佬那里学了点新方法

1.思考题目考察什么便是一个好方法

2.在做题之前,先对着目录,将你所需要的cpp都打出来,在我眼中这种方法有一下几点好处

♠不会出现(减少)文件名的错误

♣是自己心里有底,即使要交卷了也不心慌,因为我已经都打出来了

♥对题目有一个宏观的了解

◊不要放弃爆搜,这是一个几乎万能的方法,有时比你费劲心思去想正解得到的分数还多(今天就是一个例子)

(由于还没交流,我就只解决有题解的T4)


 

1.pf
题目描述

pf 是个斐波那契数迷。他是如此的酷爱这个数列,因此他想知道很多关
于这个数列的东西,比方说第 N 个斐波那契数是多少啊、前 N 项的和是
多少啊,如何用若干个斐波那契数的和表示一个自然数啊之类之类的。今天
他希望知道的是:他想用第 1 个、第 2 个„第 N 个斐波那契数构成一个
长度为 P 的序列,每个斐波那契数可以使用任意多次,但至少要使用一次,
并且序列中任意两个相同的斐波那契数之间至少要隔着 M 个数, pf 希望知
道满足条件的序列组成方法有多少种。记 fib[i] 表示第 i 个斐波那契数,
fib[0]=fib[1]=1,fib[i]=fib[i-1]+fib[i-2] (i>1)。

输入

输入只有三个整数 N,M,P

输出

输出一个数字表示序列组成方法,由于结果可能很大,只需输出结果模上
1000000007 就可以

样例输入

2 1 4

样例输出

2

数据规定

对于 100% 的数据,有 1 ≤ N ≤ P ≤ 1000,0 ≤ M ≤ N

对于这道题目,我有点无语,这就是那道我想都懒得想就乱打一气的题目

 

 


 

2.守卫者的挑战

 

 


 

3.hamilton
题目描述

hyc 喜欢研究各种各样奇奇怪怪的东西~
一天,hyc 研究了一个关于哈密顿路的问题。
如果一条路径满足:不经过重复顶点、不经过重复边、首尾相连, 那么称
这条路径为简单环。
给出一张无向图,求这个无向图当中长度不小于 3 (即经过不少于 3 个点)
的简单环的个数。

输入

第一行两个整数 N、M,表示图有 N 个点、M 条边。
接下来 M 行,每行两个整数 a、b,表示顶点 a 和顶点 b 之间有一条无
向边。
数据保证没有自环和重边的出现。

输出

一行一个整数,表示无向图当中长度不小于 3 的简单环的个数。

样例输入

4 6

1 2

1 3

1 4

2 3

2 4

3 4

样例输出

7

数据规定

对于 50% 的数据 , 保证答案不大于 10^6.
对于 100% 的数据 ,N<=20, 保证答案可以用 64 位整形存储 .

 


 

4.修理草坪  

 

#include<bits/stdc++.h>
using namespace std;
#define ll long long;
ll n,m,a[100010],sum[100010],f[100010];
ll d[100010];
int q[100010],head=0,tail=1;
int scan()
{
    int as=0;
    char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9')
    {
        as=(as<<3)+(as<<1)+c-'0';
        c=getchar();
    }
    return as;
}
ll que(int i)
{
    d[i]=f[i-1]-sum[i];
    while(head<=tail&&[q[tail]]<d[i]) tail--;
    q[++tail]=i;
    while(head<=tail&&q[head]<i-m) head++;`
    return d[q[head]];
}
int main()
{
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)
    {
        a[i]=scan();//a[i]数组记录
        sum[i]=sum[i-1]+a[i];//记录前缀和
    }
    for(int i=1;i<=n;i++)
    {
        f[i]=que(i)+sum[i];
    }
 

 

推荐阅读