2022-10-6
T1
炼心
题目背景
“既然你已拜入算法门下,我便为你讲讲这算法的修炼之道,算法之道,分几重境界,初入编程,便是普及,普及之上更有提高。提高之上,一劫一境界。提高巅峰强者引天雷入体渡劫,便能成就省选,省选再渡劫,便是集训队,集训队再渡劫,便证得IOI大道。天榜之下还有地榜,从校赛市赛省赛一路渡劫,证得ICPC world final总决赛。不过,天榜学历皆不过高中,个个都是万里挑一的奇才。为师便考考你,这天地二榜,谁为首。”
题目描述
算法之路中有
天榜学历不超过
你需要分别输出,天榜地榜当中,程序设计能力最强的同学中,学历最小的名字,存在多个则输出字典序最小的那一个,如果榜上无人,输出
输入格式
第一行一个整数
接下来
输出格式
两行,第一行为天榜强者的名字,第二行为地榜强者的名字。
样例
样例输入
5
cafeiin 18 11
George_Plover 20 12
Karshilov 19 12
wzk 23 14
Lenska 18 12
样例输出
George_Plover
wzk
数据范围与提示
对于
对于
对于
对于
保证名字互不相同
思路
简单排序题,按学历分成天榜地榜两类,分别按能力第一关键字、学历第二关键字、名字第三关键字排序输出即可。
代码
#include<bits/stdc++.h>
#define MAXN 100010
using namespace std;
int n,a,b;
string s;
struct node
{
string nam;
int a,b;
};
bool cm(string a,string b)//a<b
{
int la=a.length(),lb=b.length();
int len=min(la,lb);
for(int i=0;i<len;i++)
{
if(a[i]>b[i])return false;
}
return la<lb?true:false;
}
node tian[MAXN],di[MAXN];
int tott=0,totd=0;
bool cmp(node a,node b)
{
if(a.a!=b.a)return a.a>b.a;
if(a.b!=b.b)return a.b<b.b;
return a.nam<b.nam;
}
string sread()
{
getchar();
char c=getchar();
string ans;
while(c!=' ')
{
ans+=c;
c=getchar();
}
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
//cin>>s;
s=sread();
scanf("%d%d",&a,&b);
if(b<=13)
{
tian[++tott].nam=s;
tian[tott].a=a;
tian[tott].b=b;
}
else
{
di[++totd].nam=s;
di[totd].a=a;
di[totd].b=b;
}
}
sort(tian+1,tian+tott+1,cmp);
sort(di+1,di+totd+1,cmp);
if(tott)cout<<tian[1].nam<<endl;
else cout<<"-1"<<endl;
if(totd)cout<<di[1].nam;
else cout<<"-1";
return 0;
}
T2
炼气
题目背景
师傅讲完算法大道,便将一本黑色厚书丢给了
虽然
题目描述
这本书可以看作一个长度为
师傅说,这本书有千万种变化,如果对于一个区间
输入格式
第一行一个整数
接下来
输出格式
一行一个整数,表示字符串
样例
样例输入
4
abab
样例输出
7
样例解释:区间(1,1),(1,3),(1,4),(2,2),(2,4),(3,3),(4,4)满足条件
数据范围与提示
对于
对于
对于
思路
一个区间是“法门”的条件是有不超过
但这样的复杂度是
考虑从左到右扫一边,同时记录一个
代码
#include<bits/stdc++.h>
#define MAXN 67108865
#define int long long
using namespace std;
string s;
int n,st,a[MAXN]={0},ans=0;
bool flag=0;
string sread()
{
char c=getchar();
string ans;
while(c>='a'&&c<='z')
{
ans+=c;
c=getchar();
}
return ans;
}
string to_b(int x)
{
string ans;
while(x)
{
ans+=(x%2)+'0';
x>>=1;
}
while(ans.length()<2){ans+='0';}
return ans;
}
signed main()
{
scanf("%lld",&n);
getchar();
s=sread();
st=0;
a[st]=1;
for(int i=1;i<=n;i++)
{
flag=0;
st^=(1<<(s[i-1]-'a'));
for(int j=1;j<=26;j++)
ans+=a[st^(1<<(j-1))];
ans+=a[st];
a[st]++;
}
printf("%d",ans);
return 0;
}
T3
炼体(原题:将军令)
题目背景
“又说回来了,虽说为师当年损失了元神,但是为师的图论......啊不炼体之术可没有落下,这炼体之
道,打通奇经八脉......”
题目描述
人体的经脉可以简化成一个有
为
根据修行的炼体之术,一旦有一个穴位被打通,那么与它距离不超过
Cafeiin想知道,最少需要打通自己多少个穴位,才能"活化"自己全身所有的穴位。
输入格式
第一行一个整数
接下来
输出格式
一行一个整数,表示所需打通最少穴位数量样例。
样例输入1
4 1
1 2
1 3
1 4
样例输出1
1
样例输入2
6 1
1 2
1 3
1 4
4 5
4 6
样例输出2
2
样例
样例
数据范围与提示
对于
对于
对于
思路
这道题是一类经典的树形
但对于这道题较简单的思路并不需要树形
至于如何求出一个点是否被覆盖,我们使用一个
代码
#include<bits/stdc++.h>
#define MAXN 100010
using namespace std;
int n,k,t,x,y,now,son,ans=0;
vector<int> tmap[MAXN];
int fa[MAXN],dis[MAXN];
struct node
{
int dep,num;
}no[MAXN];
bool cmp(node a,node b)
{
return a.dep>b.dep;
}
void dfs(int st,int fat,int depp)
{
no[st].dep=depp;
fa[st]=fat;
for(int i=0;i<tmap[st].size();i++)
{
if(tmap[st][i]==fat)continue;
dfs(tmap[st][i],st,depp+1);
}
}
int main()
{
scanf("%d%d%d",&n,&k,&t);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
tmap[x].push_back(y);
tmap[y].push_back(x);
}
for(int i=1;i<=n;i++)
no[i].num=i;
dfs(1,1,0);
memset(dis,0x3f,sizeof(dis));
sort(no+1,no+n+1,cmp);
for(int i=1;i<=n;i++)
{
now=son=no[i].num;
for(int j=1;j<=k;j++)
{
now=fa[now];
dis[son]=min(dis[son],dis[now]+j);
}
if(dis[son]>k)
{
dis[now]=0;
ans++;
for(int j=1;j<=k;j++)
{
now=fa[now];
dis[now]=min(dis[now],j);
}
}
}
printf("%d",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本