2019年天梯赛补题
题目详情 - L1-064 估值一亿的AI核心代码 (pintia.cn)
思路:
- 先对原始串把字母都转为小写(除了I)
- 然后进行至多两遍操作
- 第一遍把多余空格删除,然后把替换都实现了,因为涉及同时存在you转i,又有i转you,我可以对you can之类转化为I Can,对于 I 转化为You,这样保证修改的是原始串的信息
- 第二遍删除了多余空格后,把原本可能隔开很远的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
- 数据只有1e4,显然可以暴力出所有幸福数。也可以同时记录每个幸福数有多少个依赖数
- 对于区间依附,我们可以判断是否在区间内,从而记录它是否独立
- 素数用埃氏筛
#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)
思路:
- 祖先显然就是一棵(多棵)祖先树。
- 我们可以记录每个点的父亲与初代祖先
- 之后对初代祖先们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<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了
- 数据1e2求最短路,显然暴力floyd
- 对于每个站点,我们可以处理它每个花费可以去的最远的点(当然,如果能到首尾终点站,则无视它是不是最远),最后重新建立点与点之间的单向边构成的有向图。
- 因为数据只有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
我们只需要从输出点 不断深入模拟,自然就得到函数值,求导也一样,不过不同变量的求导,每个点求导值不一样,所以需要每个变量各自求一遍
#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年天梯赛补题相关推荐
- 2021 CCCC天梯赛补题
前言不想看请直接跳过---- 前言+检讨:天梯赛我拉垮了,我拖了队伍后腿,我有罪. 分析原因,首先是前一个星期训练量不够,没有跟上队友训练的进度,一些基础的STL的用法使用的也不熟练. 第二,没有把S ...
- 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 ...
- 天梯赛补题:L3-021 神坛 (30 分)
在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...
- 团体程序设计天梯赛真题(部分题解,持续更新)
文章目录 天梯赛真题 L1-008 求整数段和(10分) 输入格式: 输出格式: 输入样例: 输出样例: 解题过程: L1-018 大笨钟(10分) 输入格式: 输出格式: 输入样例1: 输出样例1: ...
- 2019年电赛D题《简易电路特性测试仪》全过程
本人为团队中负责硬件部分,为了准备2022年电赛,本队伍已经制作2019年和2021年电赛信号题,本次主要讲解为2019年电赛D题硬件部分,少部分为软件需要做的部分.后续会对整个硬件进行优化和整理. ...
- 2019年美赛C题画图,python函数库basemap下载
第一次接触建模,就碰到要画美国的地图(2019年美赛C题),实在是头疼.解决的函数找到了,结果第三方库无法下载,虽然知道可以通过.whl直接下载,但有100多M下载时间实在太长,分享一个下载包括所有的 ...
- 网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]路由交换部分答案详解
网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]路由交换部分答案详解 2022年全国职业技能大赛网络系统管理赛项相较2021年再次做出改动,Linux部 ...
- 林大5.1训练赛补题
林大5.1训练赛补题 A.凸多边形曼哈顿 E.矩阵快速幂 I.线段dp A.凸多边形曼哈顿 题意:给你一个凸多边形,问你当其中K边形的最大dis[]是多少? 思路:首先是要发现K>=4的时候答案 ...
- 【立创EDA开源推荐】005期 | 2019年电赛H题 电磁炮(激光版)
工程名称: 2019年电赛H题 电磁炮(激光版) 工程作者:zzxw 工程主页链接: https://oshwhub.com/kakaka/tu-ya-zhi-neng-yun-duo 开源协议: G ...
最新文章
- arg是什么函数_java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪...
- python web框架介绍对比
- 12-继承与多态(下)
- yum安装zlib出错
- 93. Leetcode 64. 最小路径和 (动态规划-路径规划)
- 【ABAP】 屏幕图片显示Demo
- linux编程:getenv,putenv,setenv
- PHP获取当月天数,获取当月的每天的开始和结束的时间戳,获取当月每号
- JavaScript学习之—prototype
- Android Webview SSL 自签名安全校验解决方案
- QQ官方单向好友删除 免软件
- php在线编辑器脚本,PHP如何搭建百度Ueditor富文本编辑器
- ThinkPad E430 选择U盘启动后又跳回选择画面
- 数字藏品指南系列第五篇:验证智能合约
- 关于导数意义的新认知
- Lintcode 4 Ugly Number II
- PHP开发很好用的编辑器,
- android教程 易百教程,Android RadioGroup
- 箱形图怎么看,以及它反映了什么?
- swagger添加注解后不显示接口信息问题
热门文章
- 物资采购合同常见的“九大问题
- Android连上USb不充电,为什么手机usb连不上电脑只显示充电 安卓手机解决方法
- 关于初学Python需要安装哪些软件?我整理了最全的解析,初学必备
- 判断列表中元素是都都大于零
- SonarQube 数据中心版 v9.5
- 音频翻译字幕中文在线怎么弄?不妨看看这三个方法
- Rainbond之NFS文件挂载(下篇)
- 阿里分布式数据oceanbace简单部署 oceanbace
- 戴尔服务器0xc0000001怎么修复,错误代码:0xc0000001蓝屏 解决方法
- ROS学习-3 (C++编程实现创建发布者+发布数据控制海龟运动)