题意:数1-2020年中数位包含2的年份有多少个。
思路:签到题就没啥好说的了。
Ans:563
#include
using namespace std;
bool check(int x){
while(x){
if(x%10 == 2) return true;
x /= 10;
}
return false;
}
signed main(){
int res = 0;
for(int i = 1 ; i <= 2020 ; i ++)
res += check(i);
cout<<res<<endl;
return 0;
}
/**
563
**/
题意:无限大的网格,给定四个初始点为黑色格子,每分钟都可以向四个方向扩散,问2020分钟后,总共有多少个黑格子。
思路:dfs,由不同初始格子扩散到的点打上不同标记。扩散到没标记过的就答案+1就好了,这题都不知道做对了没,题目也没说格子有没有负数坐标的(想想5分题,不至于搞个坐标平移吧)。
Ans: 2066591
在这里插入代码片
题意:求 100!总共有多少个约数(因子)
思路:对于一个数X,分解质因子 X = Pk1Pk2Pk3,那么约数总个数就是(k1+1)*(k2+1)*(k3+1),对于100的阶乘,把(1-100)分别分解质因子,然后所有质因子的个数统计一下,最后乘起来。(前一天晚上刚和室友讲了怎么求一个数的约数个数。结果就考到了。)
Ans:39001250856960000
在这里插入代码片
题意:对于给定的那个不算很长的字符串,求总共有多少个本质不同的严格上升的子序列。本质不同也就是长得不一样就行。
思路:显然是一个DP。感觉也可以搜索。不知道会不会爆。对于本质不同的串,开map标记一下就行。不过程序复杂度太高,跑了几分钟才出结果。
Ans:3616159
在这里插入代码片
题意:把1-16个数字填入4x4的方格中,要求相邻的数在表格中的位置相邻就好了,求共多少种摆法。
思路:显然是dfs,甚至都不需要记忆化状压之类的骚操作。每次按顺序往相邻位置填数,填到16的就是合法方案。不合法的情况都会提前退出。
Ans:552
#include
using namespace std;
int mark[100][100];
int dir[][2] = {
0,1,1,0,-1,0,0,-1};
int res = 0;
bool check(int x,int y){
return x >=0 && y >= 0 && x < 4 && y < 4;
}
void show(){
for(int i = 0 ; i < 4 ; i ++){
for(int j = 0 ; j < 4 ; j ++){
printf("%3d",mark[i][j]);
}
printf("\n");
}
printf("\n");
}
void dfs(int x,int y,int id){
mark[x][y] = id;
if(id == 16){
res ++;
show();
mark[x][y] = 0;
return ;
}
for(int i = 0 ; i < 4 ; i ++){
int xx = x+dir[i][0];
int yy = y+dir[i][1];
if(check(xx,yy) && !mark[xx][yy]){
dfs(xx,yy,id+1);
}
}
mark[x][y] = 0;
}
int main()
{
for(int i = 0 ; i < 4 ; i ++){
for(int j = 0 ; j < 4 ; j ++){
dfs(i,j,1);
}
}
cout<<res<<endl;
return 0;
}
题意:给定一个字符串,里面包含N多个人名,每个人名的首字母都是大写的。求 人名 的最长上升子序列。如果有长度相同的字符列,取字典序最小的。
思路:预处理字符串,然后求LIS就好了,怎么老喜欢一场比赛考相同的知识点呢。至于字典序最小,我是在DP的过程中连同LIS一起记录。显然会超时或者爆内存。不过时间复杂度反正也过不去大数据,无所谓了。改的话可以改成对每个位置记录前驱,最后原路返回输出答案。
Ans:
在这里插入代码片
题意:每个人有三个时间,s,t,e,然后排队进办公室后经过 s+t 的时间,就去班群冒个泡,冒泡持续 e 的时间,求 怎么合理安排顺序,使得每个人发消息的时间点 总和最小。
思路:好像写错了。我也就排了个序,怎么说这20分的题不至于这么水吧。而且数据最大给的1000。难道不是给的n2时间吗(莫非是考冒泡排序)。然而并没有什么别的思路
Ans:
在这里插入代码片
吐槽:理论上是个bfs,最后一小时写的,码了40分钟,无果,遂放弃。
题意:三维的网格。从左下角走到右上角。每次可以往三个方向走,但是一步只能走质数长度的,且中间有两个点不可到达。
思路:很容易想到DP吧,但是给的数据很大,DP只能过小数据。处理一下质数,然后根据二维走方格的算法推到三维就好了。
Ans:
在这里插入代码片