题目详情 - L1-064 估值一亿的AI核心代码 (pintia.cn)

思路:

  1. 先对原始串把字母都转为小写(除了I)
  2. 然后进行至多两遍操作
    1. 第一遍把多余空格删除,然后把替换都实现了,因为涉及同时存在you转i,又有i转you,我可以对you can之类转化为I Can,对于 I 转化为You,这样保证修改的是原始串的信息
    2. 第二遍删除了多余空格后,把原本可能隔开很远的you       can之类变成you can,这次目的就是把剩下没有转化的全部转化了。
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long longbool judnum(char c)//0是字母数字
{if ((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c>='0'&&c<='9'))return 0;else return 1;
}
bool judb(char c)//符号返回1
{if (judnum(c)==0||c==' ')return 0;else return 1;
}void mysolve()
{int n;cin>>n;getchar();while (n--){string s;getline(cin,s);cout<<s<<endl;cout<<"AI: ";for (int i=0; i<(int)s.size(); ++i)//先全部转为小写{if (s[i]>='A'&&s[i]<='Z'&&s[i]!='I')s[i]=s[i]-'A'+'a';}string a="";bool fl=1;while (fl){bool flag=1;a="";fl=0;int tk=0;int len=(int)s.size();for (int i=0; i<len; ++i){if (flag&&s[i]==' ')continue;//删除前导空格else{if (s[i]==' '){if (i+1<len&&judb(s[i+1]))continue;//空格后面是符号else if (tk>0)//多个空格{fl=1;//删除多个空格,需要重来一次continue;}else if (tk==0){tk=1;a+=' ';continue;}}else//不是空格{tk=0;flag=0;if (s[i]=='?'){a+='!';continue;}if (s[i]=='I'&&judnum(s[i-1])&&judnum(s[i+1])&&!(s.substr(i,5)=="I Can"&&judnum(s[i+5]))&&!(s.substr(i,7)=="I Could"&&judnum(s[i+7]))){a+="You";//大写防止被转化continue;}if (s[i]=='m'&&s[i+1]=='e'&&judnum(s[i-1])&&judnum(s[i+2])){i++;a+="You";continue;}if (s[i]=='c'){string tmp=s.substr(i,min((int)s.size()-i+1,7ll));if (tmp=="can you"&&judnum(s[i+7])&&(i==0||judnum(s[i-1]))){a+="I Can";i+=6;continue;}tmp=s.substr(i,min((int)s.size()-i+1,9ll));if (tmp=="could you"&&judnum(s[i+9])&&(i==0||judnum(s[i-1]))){a+="I Could";i+=8;continue;}}}a+=s[i];}}while ((int)a.size()&& *a.rbegin()==' ')a.pop_back();//删除后导空格s=a;}for (int i=0; i<(int)a.size(); ++i){if (a[i]>='A'&&a[i]<='Z'&&a[i]!='I')a[i]=a[i]-'A'+'a';//因为转化保留一些大写字母,改写回来}cout<<a<<endl;}}int32_t main()
{//std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);mysolve();system("pause");return 0;
}

题目详情 - L2-029 特立独行的幸福 (pintia.cn)

思路:DFS

  1. 数据只有1e4,显然可以暴力出所有幸福数。也可以同时记录每个幸福数有多少个依赖数
  2. 对于区间依附,我们可以判断是否在区间内,从而记录它是否独立
  3. 素数用埃氏筛
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
const int N = 1e4 + 10;int vis[N],in[N],book[N];
int a,b;
int getpin(int x)
{int ans=0;while (x){ans+=(x%10)*(x%10);x/=10;}return ans;
}int dfs(int x)
{if (vis[x])return vis[x];//-1表示不是幸福数,1表示是,0表示还未处理int v=getpin(x);vis[x]=-1;//初始设置为不是,防止循环vis[x]=dfs(v);if (vis[x]==1)//如果回来检测到他是幸福数,显然v依附x(v由x得到){if (x<=b&&x>=a)//如果x在区间内,显然v在区间内有依附,不独立book[v]=1;//标记为1就是不独立in[x]=in[v]+1;//in表示包括x自己在内的依附与它的数,显然,依附于v的数也依附于x}return vis[x];
}bool judsu(int x)//埃氏筛
{if (x==1||x==2||x==4)return 0;if (x==3||x==5)return 1;if (x%6!=1&&x%6!=5)return 0;for (int i=5; i*i<=x; i+=6)if (x%i==0||x%(i+2)==0)return 0;return 1;
}void mysolve()
{cin>>a>>b;vis[1]=in[1]=1;for (int i=2; i<=1e4; ++i){if (vis[i])continue;dfs(i);}bool flag=0;for (int i=a; i<=b; ++i){if (vis[i]==1&&!book[i])//是幸福数且独立{flag=1;int ans=in[i]-1;if (judsu(i))ans*=2;cout<<i<<" "<<ans<<endl;}}if (!flag)cout<<"SAD"<<endl;}int32_t main()
{std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);ll t=1;//cin >> t;while (t--){mysolve();}system("pause");return 0;
}

题目详情 - L2-030 冰岛人 (pintia.cn)

思路:

  1. 祖先显然就是一棵(多棵)祖先树。
  2. 我们可以记录每个点的父亲与初代祖先
  3. 之后对初代祖先们dfs建立深度即可
  4. 注意,其他人是不属于祖先树的,所以他们只要性别符合就可以跟冰岛人爱爱 ,不能列入祖先树(会有案例卡)
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl<<endl
typedef unsigned long long ull;
typedef pair<long long, long long> pll;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const int N = 2e5 + 10;unordered_map<string,int>mp;
int cnt;
struct node
{int next,to;
} edge[N<<1];
int head[N],num;
void add(int u,int v)
{edge[++num].next=head[u];edge[num].to=v;head[u]=num;
}
bool sex[N];//记录性别,1为男,0为女
int fa[N],in[N],dep[N],pre[N];void dfs(int u,int fa,int f)//遍历祖先树建立深度
{dep[u]=dep[fa]+1;pre[u]=f;//标记每个点的初代祖先for (int i=head[u]; i; i=edge[i].next){int v=edge[i].to;dfs(v,u,f);}
}void mysolve()
{int n;cin>>n;string a,b,tmp;while (n--){cin>>a;if (!mp[a])mp[a]=++cnt;cin>>b;int len=(int)b.size();if (b[len-1]=='m')sex[mp[a]]=1;else if (b[len-1]=='n'){sex[mp[a]]=1;tmp=b.substr(0,len-4);//是冰岛人就建立关系边if (!mp[tmp])mp[tmp]=++cnt;fa[mp[a]]=mp[tmp];add(mp[tmp],mp[a]);in[mp[a]]++;}else if (b[len-1]=='r'){tmp=b.substr(0,len-7);if (!mp[tmp])mp[tmp]=++cnt;fa[mp[a]]=mp[tmp];add(mp[tmp],mp[a]);in[mp[a]]++;}}for (int i=1; i<=cnt; ++i)if (!in[i])dfs(i,i,i);//对所以初代祖先建立祖先树int q;cin>>q;while (q--){cin>>a>>tmp>>b>>tmp;int x=mp[a],y=mp[b];if (!x||!y)//不存在这个人{cout<<"NA"<<endl;continue;}else if ((sex[x]^sex[y])==0)//性别相同{cout<<"Whatever"<<endl;continue;}else{if (pre[x]!=pre[y])//初代祖先不同{cout<<"Yes"<<endl;continue;}else{int lo=min(dep[x],dep[y]);//相同则找lca,判断是否符合即可while (dep[x]!=dep[y]){if (dep[x]<dep[y])swap(x,y);x=fa[x];}while (x!=y)x=fa[x],y=fa[y];int ans=lo-dep[x];if (ans>=4)cout<<"Yes"<<endl;else cout<<"No"<<endl;}}}}int32_t main()
{
//  std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);mysolve();system("pause");return 0;
}

题目详情 - L3-022 地铁一日游 (pintia.cn)

思路:它又考floyd了

  1. 数据1e2求最短路,显然暴力floyd
  2. 对于每个站点,我们可以处理它每个花费可以去的最远的点(当然,如果能到首尾终点站,则无视它是不是最远),最后重新建立点与点之间的单向边构成的有向图。
  3. 因为数据只有1e2,所以每次求一个站点,我们都可以每次来一次dfs求出他能经过的站点
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl<<endl
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
//double 型memset最大127,最小128
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const int N = 210;int dp[N][N],tend[N];
vector<int>edge[N];
bool vis[N];
void dfs(int u)//dfs求可以经过的点
{vis[u]=1;for (auto v:edge[u]){if (!vis[v])dfs(v);}
}void mysolve()
{int n,m,k;cin>>n>>m>>k;memset(dp,0x3f,sizeof(dp));int x,w,y;while (m--){cin>>x;tend[x]=1;//tend存储首尾终点站while (1){cin>>w>>y;dp[x][y]=dp[y][x]=min(dp[x][y],w);x=y;char c=getchar();if (c=='\n')break;}tend[x]=1;}for (int kk=1; kk<=n; ++kk)for (int i=1; i<=n; ++i)for (int j=1; j<=n; ++j)if (i!=j)dp[i][j]=min(dp[i][j],dp[i][kk]+dp[kk][j]);//floydfor (int i=1; i<=n; ++i){unordered_map<int,int>cost;//cost[p]记录花费p时最远距离for (int j=1; j<=n; ++j){if (dp[i][j]<INF){int p=(dp[i][j])/k;if (dp[i][j]>cost[p])cost[p]=dp[i][j];}}for (int j=1; j<=n; ++j)if (dp[i][j]<INF&&(dp[i][j]==cost[dp[i][j]/k]||tend[j]))edge[i].push_back(j);//对于每个点,它如果符合是对于花费的最远点的距离或者他是终点站,那么可以建立单向边}int q;cin>>q;while (q--){cin>>x;memset(vis,0,sizeof(vis));//询问每次dfs即可,记得初始化dfs(x);bool flag=1;for (int i=1; i<=n; ++i)if (vis[i]){if (flag)flag=0,cout<<i;else cout<<" "<<i;}cout<<endl;}
}int32_t main()
{//std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);ll t=1;//cin >> t;while (t--){mysolve();}system("pause");return 0;
}

题目详情 - L3-023 计算图 (pintia.cn)

思路:还是dfs

  1. 我们只需要从输出点 不断深入模拟,自然就得到函数值,求导也一样,不过不同变量的求导,每个点求导值不一样,所以需要每个变量各自求一遍

#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl<<endl
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
//double 型memset最大127,最小128
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const int N = 2e5 + 10;
int in[N];
struct node
{int x,y,id;//x,y记录运算符的左右值,id表示操作double w;//w表示当前函数值
} b[N];
double dm[N];//表示当前节点导数值double dfs(int u)//求函数
{if (b[u].w<INF)return b[u].w;else if (b[u].id==1)b[u].w=dfs(b[u].x)+dfs(b[u].y);else if (b[u].id==2)b[u].w=dfs(b[u].x)-dfs(b[u].y);else if (b[u].id==3)b[u].w=dfs(b[u].x)*dfs(b[u].y);else if (b[u].id==4)b[u].w=exp(dfs(b[u].x));else if (b[u].id==5)b[u].w=log(dfs(b[u].x));else if (b[u].id==6)b[u].w=sin(dfs(b[u].x));return b[u].w;
}double dfs1(int u,int i)//求导数,就是导数公式
{if (dm[u]!=INF)return dm[u];else if (b[u].id==0)return dm[u]=(u==i?1:0);else if (b[u].id==1)dm[u]=dfs1(b[u].x,i)+dfs1(b[u].y,i);else if (b[u].id==2)dm[u]=dfs1(b[u].x,i)-dfs1(b[u].y,i);else if (b[u].id==3)dm[u]=dfs1(b[u].x,i)*b[b[u].y].w+dfs1(b[u].y,i)*b[b[u].x].w;else if (b[u].id==4)dm[u]=exp(b[b[u].x].w)*dfs1(b[u].x,i);else if (b[u].id==5)dm[u]=1.0/b[b[u].x].w*dfs1(b[u].x,i);else if (b[u].id==6)dm[u]=cos(b[b[u].x].w)*dfs1(b[u].x,i);return dm[u];
}void mysolve()
{int n;cin>>n;set<int>s;int op;for (int i=0; i<n; ++i){cin>>op;b[i].w=INF;if (op==0)cin>>b[i].w,s.insert(i);else if (op>=1&&op<=3)cin>>b[i].x>>b[i].y,in[b[i].x]++,in[b[i].y]++;else cin>>b[i].x,in[b[i].x]++;b[i].id=op;}int fa;for (int i=0; i<n; ++i)if (!in[i]){fa=i;printf("%.3lf\n",dfs(i));break;}bool flag=1;for (auto k:s){for (int i=0; i<=n; ++i)dm[i]=INF;//每次求导记得初始化if (flag)flag=0,printf("%.3lf",dfs1(fa,k));else printf(" %.3lf",dfs1(fa,k));}
}int32_t main()
{
//  std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);ll t=1;//cin >> t;while (t--){mysolve();}system("pause");return 0;
}

2019年天梯赛补题相关推荐

  1. 2021 CCCC天梯赛补题

    前言不想看请直接跳过---- 前言+检讨:天梯赛我拉垮了,我拖了队伍后腿,我有罪. 分析原因,首先是前一个星期训练量不够,没有跟上队友训练的进度,一些基础的STL的用法使用的也不熟练. 第二,没有把S ...

  2. 4.124.13天梯赛补题

    7-8 悄悄关注 (25 分) 输入样例1: 10 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao 8 Magi 50 Pota 30 LLao 3 ...

  3. 天梯赛补题:L3-021 神坛 (30 分)

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  4. 团体程序设计天梯赛真题(部分题解,持续更新)

    文章目录 天梯赛真题 L1-008 求整数段和(10分) 输入格式: 输出格式: 输入样例: 输出样例: 解题过程: L1-018 大笨钟(10分) 输入格式: 输出格式: 输入样例1: 输出样例1: ...

  5. 2019年电赛D题《简易电路特性测试仪》全过程

    本人为团队中负责硬件部分,为了准备2022年电赛,本队伍已经制作2019年和2021年电赛信号题,本次主要讲解为2019年电赛D题硬件部分,少部分为软件需要做的部分.后续会对整个硬件进行优化和整理. ...

  6. 2019年美赛C题画图,python函数库basemap下载

    第一次接触建模,就碰到要画美国的地图(2019年美赛C题),实在是头疼.解决的函数找到了,结果第三方库无法下载,虽然知道可以通过.whl直接下载,但有100多M下载时间实在太长,分享一个下载包括所有的 ...

  7. 网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]路由交换部分答案详解

    网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]路由交换部分答案详解 2022年全国职业技能大赛网络系统管理赛项相较2021年再次做出改动,Linux部 ...

  8. 林大5.1训练赛补题

    林大5.1训练赛补题 A.凸多边形曼哈顿 E.矩阵快速幂 I.线段dp A.凸多边形曼哈顿 题意:给你一个凸多边形,问你当其中K边形的最大dis[]是多少? 思路:首先是要发现K>=4的时候答案 ...

  9. 【立创EDA开源推荐】005期 | 2019年电赛H题 电磁炮(激光版)

    工程名称: 2019年电赛H题 电磁炮(激光版) 工程作者:zzxw 工程主页链接: https://oshwhub.com/kakaka/tu-ya-zhi-neng-yun-duo 开源协议: G ...

最新文章

  1. arg是什么函数_java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪...
  2. python web框架介绍对比
  3. 12-继承与多态(下)
  4. yum安装zlib出错
  5. 93. Leetcode 64. 最小路径和 (动态规划-路径规划)
  6. 【ABAP】 屏幕图片显示Demo
  7. linux编程:getenv,putenv,setenv
  8. PHP获取当月天数,获取当月的每天的开始和结束的时间戳,获取当月每号
  9. JavaScript学习之—prototype
  10. Android Webview SSL 自签名安全校验解决方案
  11. QQ官方单向好友删除 免软件
  12. php在线编辑器脚本,PHP如何搭建百度Ueditor富文本编辑器
  13. ThinkPad E430 选择U盘启动后又跳回选择画面
  14. 数字藏品指南系列第五篇:验证智能合约
  15. 关于导数意义的新认知
  16. Lintcode 4 Ugly Number II
  17. PHP开发很好用的编辑器,
  18. android教程 易百教程,Android RadioGroup
  19. 箱形图怎么看,以及它反映了什么?
  20. swagger添加注解后不显示接口信息问题

热门文章

  1. 物资采购合同常见的“九大问题
  2. Android连上USb不充电,为什么手机usb连不上电脑只显示充电 安卓手机解决方法
  3. 关于初学Python需要安装哪些软件?我整理了最全的解析,初学必备
  4. 判断列表中元素是都都大于零
  5. SonarQube 数据中心版 v9.5
  6. 音频翻译字幕中文在线怎么弄?不妨看看这三个方法
  7. Rainbond之NFS文件挂载(下篇)
  8. 阿里分布式数据oceanbace简单部署 oceanbace
  9. 戴尔服务器0xc0000001怎么修复,错误代码:0xc0000001蓝屏 解决方法
  10. ROS学习-3 (C++编程实现创建发布者+发布数据控制海龟运动)