计算abc

首先 \(0<=a<=b<=c\)

会随机给出

\(a+b,a+c,b+c,a+b+c\)的值

因为\(a,b,c\)都为正整数,所以\(a+b+c\)一定为最大值

然后用\(a+b+c\)逐个减去即可(注意\(a,b,c\)大小

  • code
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int x[5];
int main(){
for(int i=1;i<=4;++i) cin>>x[i];
sort(x+1,x+5);
for(int i=3;i>=1;--i) cout<<x[4]-x[i]<<" ";
return 0;
}

凑平方

根据题意模拟,不难想到暴力枚举,枚举出每一个由原数删了后的数

再看数据范围,数的长度最多十位,所以每个数最多枚举2^10次,每次枚举最多10次,\(t<=10\)组数据

n为数的长度

所以时间复杂度\(O(2^n*n*t)\)

  • 具体实现

    (dfs,bfs都可以)

    这里有一种巧妙,易实现的方法

利用二进制

举个例子

原数\(2081\)

$(1010)_2 $ 1就代表不删相应位置数,0代表删了相应位置的数

按照上述规则,删了后的数为 28

\((0111)_2\) 删了后的数字为 081 ,但这里你会发现有前导0,但其实具体实现的时候不会有这个问题,因为我们是一位一位的转化成整型,巧妙的避免了前导0的问题

既然是找最少次删除操作

那枚举顺序\(0-2^n\)

  • code
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream> using namespace std;
string s;
int t;
int stlen(int x){//求x的位数
int ans=0;
for(;x;++ans) x/=10;return ans;
}
int main(){
cin>>t;
while(t--){
cin>>s;
int len=s.length();
int ans=100;
for(int i=0;i<(1<<len);++i){
int x=0;
for(int j=0;j<len;++j)
if(i>>j & 1)
x=x*10+s[j]-'0';
int sq=sqrt(x);
if(x && sq*sq==x) ans=min(ans,len-stlen(x));
}
if(ans!=100) cout<<ans<<endl;
else cout<<"-1"<<endl;
}
}

最大化最短路

突破口 :必须选出两个特殊点

那么考虑三种情况

设两个特殊点分别为\(x,y\)

  • 选了\(x,y\)但不经过任意\(x,y\)

  • 经过两个\(x,y\)最短路径是从\(1——>n\)

  • 经过两个\(x,y\)最短路径是从\(n——>1\)

设\(dis1[],dis2[]\)分别为1到各个点的最短距离,n到各个点的最短距离

三种情况分别能得出的答案即为

1.\(dis1[n]\) (不经过任何点即为最短路

2.\(dis1[x]+1+dis2[y]\) (1——>x+x——>y+y——n

3.\(dis2[x]+1+dis1[y]\) (n——>x+x——>y+y——1

求出后两种情况的最大值之后

在三者情况种取最小值(为什么不取较大两个值,因为较大两个虽然构成最短路,但在三种情况一起讨论的时候,并不较大的两个值并不构成最短路

也就是说,添加一条边之后很有可能最短距离会减小)

第一情况跑一下最短路就可

第二种和第三种情况,首先要预处理

\(dis1[]和dis2[]\),跑一遍最短路即可

最终求的是1到n最短距离尽可能大

所以现在的目标就是求出2,3情况的最大值,取其中得最小值(

如果暴力求话直接GG

假设\((i,j)\)为一对且\(i!=j\),而且i,j∈特殊点

任取一对,则二三情况得到的答案

\(max(min(dis1[i]+1+dis2[j],dis1[j]+dis[i]+1))\)

当dis1[i]+1+dis2[j]<=dis1[j]+dis[i]+1时

即dis1[i]-dis2[i]<=dis[j]-dis2[j];

将数对根据差值排序

此时

当数对后一个为x时

取max(dis1[1~x-1])+dis2[x])

x从1~k

取出的最大值,最后与dis1[n]取最小值即可

  • code
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<iostream> using namespace std;
int n,m,k;const int maxn=2e5+10;
int head[maxn*2];
int p[maxn];
int cnt=0;
int dis1[maxn],dis2[maxn];
struct node{
int v,next;
}e[maxn*2];
void add(int u,int v){
e[++cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt;
}
bool cmp(int a,int b){
return dis1[a]-dis2[a]<dis1[b]-dis2[b];
}
void dj(int st,int dis[]){
bool vl[maxn];
memset(vl,0,sizeof(vl));
memset(dis,0x3f3f3f3f,maxn*4);
dis[st]=0;
priority_queue<pair<int,int> >q;
q.push(make_pair(-dis[1],st));
while(!q.empty()){
int u=q.top().second;q.pop();
if(vl[u]) continue;
vl[u]=1;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(dis[v]>dis[u]+1){
dis[v]=dis[u]+1;
q.push(make_pair(-dis[v],v));
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);memset(head,0,sizeof(head));
for(int i=1;i<=k;++i) scanf("%d",&p[i]);
for(int i=1;i<=m;++i){
int u,v;scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
dj(1,dis1);
dj(n,dis2);
sort(p+1,p+1+k,cmp);
int res=0,x=dis1[p[1]];
for(int i=2;i<=k;++i){
int t=p[i];
res=max(res,dis2[t]+x+1);
x=max(x,dis1[t]);
}
printf("%d",min(res,dis1[n]));return 0;
}

AcWing 第11场周赛题解的更多相关文章

  1. LeetCode--179场周赛题解

    水题: class Solution { public: string generateTheString(int n) { string s; string a="a",b=&q ...

  2. LeetCode #188场周赛题解

    A题链接 给你一个目标数组 target 和一个整数 n.每次迭代,需要从 list = {1,2,3..., n} 中依序读取一个数字. 请使用下述操作来构建目标数组 target : Push:从 ...

  3. LeetCode-第 166 场周赛

    LeetCode-第 166 场周赛 1281.subtract-the-product-and-sum-of-digits-of-an-integer 1282.group-the-people-g ...

  4. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

  5. LeetCode--第180场周赛

    LeetCode--第180场周赛 1380. 矩阵中的幸运数 class Solution { public: vector<int> luckyNumbers (vector<v ...

  6. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...

  7. 【AcWing】第 62 场周赛 【2022.07.30】

    AcWing 4500. 三个元素 题目描述 给定一个长度为 \(n\) 的数组 \(r\_1,r\_2,-,r\_n\). 请你找到其中的三个元素 \(r\_a,r\_b,r\_c\),使得 \(r ...

  8. 第五场周赛(字符串卡常个人Rank赛)——题解

    本次题目因为比较简单,除了个别题目,其余题目我只写一个思路不再贴代码. 先是Div.2的题解 A题奇怪的优化,把递归函数改成2*fun(...)即可,其实看懂程序也不难,就是求a*2b: B题你会st ...

  9. 第二场周赛(递归递推个人Rank赛)——题解

    很高兴给大家出题,本次难度低于上一场,新生的六个题都可以直接裸递归式或者裸递推式解决,对于老生的汉诺塔3,需要找出一般式,后两题分别为裸ST算法(或线段树)/线性DP. 正确的难度顺序为 种花 角谷定 ...

随机推荐

  1. Linux运维网络基础

    1.网络架构的三个层次 核心层: 路由器(网关接口) 实现和外网通讯 冗余能力(主备) 汇聚层: 交换机(三层交换机) 冗余能力 策略控制能力 接入层: 交换机(二层交换机) 终端设备接入网络 2.网 ...

  2. Datahub 0.8.5发布! 通用的元数据搜索和发现工具

    近期Datahub 发布了最新的版本0.8.5,作为LinkedIn开源的通用的元数据搜索和发现工具.Datahub近一年来有了巨大的发展,也成为了很多公司进行元数据管理的调研方向并进行使用的选择. ...

  3. 【玩转 WordPress】基于 Serverless 搭建个人博客图文教程,学生党首选!

    以下内容来自「玩转腾讯云」用户原创文章,已获得授权. 01. 什么是 Serverless? 1. Serverless 官方定义 Serverless 中的 Server是服务器的意思,less 是 ...

  4. Flask(1)- 简介

    背景 为啥要学,很久之前就学过点,没写文章 最近因为要写机器人工具,其实就是简单的纯服务端工具 反正 flask 也挺简单,一天快速过完 概念会直接搬教程的,实操自己敲一遍再总结 参考教程 https ...

  5. GitLab升级(yum安装版v11.11.8~12.0.12)

    参考官方升级建议(注意升级路线:Example upgrade paths) 升级前请自行备份(测试可忽略此步骤) 生成备份文件,在/var/opt/gitlab/backups/目录下生成备份文件 ...

  6. SpringCloud:feign对象传参和普通传参及遇到的坑

    对象传参: #使用@RequestBody来指定传参对象 @RequestMapping(value = "/v2/matterCode/genCode", method = Re ...

  7. MySql:Linux下安装MySQL-5.7.12.tar.gz

    一  官网下载 mysql-5.7.12-linux-glibc2.5-x86_64.tar.gz 目前最新为5.7.16,可以直接下载mysql-5.7.16-linux-glibc2.5-x86_ ...

  8. PHP中“简单工厂模式”实例讲解(转)

      ? 1 2 3 4 5 6 7 8 原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html   简单 ...

  9. 如何搭建一个简易的 Web Terminal(一)

    前言 在介绍本篇文章的时候,先说一下本篇文章的一些背景.笔者是基于公司的基础建设哆啦 A 梦(Doraemon)一些功能背景写的这篇文章,不了解.有兴趣的同学可以去 袋鼠云 的 github 下面了解 ...

  10. 【多线程】C++ 互斥锁(mutex)的简单原理分析

    多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,分为两种类型的多任务处理:基于进程和基于线程. 1)基于进程的多任务处理是程序的并发执行. 2)基于线程 ...