文章目录

直角三角形最长平衡串

一、直角三角形IO链接

本题思路:本题就是利用欧几里得距离求解即可。

#include

int main()

{

std::ios::sync_with_stdio(false);

std::cin.tie(nullptr);std::cout.tie(nullptr);

int T;

std::cin>>T;

while(T--){

int x1,y1,x2,y2,x3,y3;

std::cin>>x1>>y1>>x2>>y2>>x3>>y3;

int a=std::pow(std::abs(x2-x1),2)+std::pow(std::abs(y2-y1),2);

int b=std::pow(std::abs(x3-x1),2)+std::pow(std::abs(y3-y1),2);

int c=std::pow(std::abs(x3-x2),2)+std::pow(std::abs(y3-y2),2);

if (a + b == c || a + c == b || b + c == a) printf("Yes\n");

else printf("No\n");

printf("%.2f\n",std::sqrt(a)+std::sqrt(b)+sqrt(c));

}

return 0;

}

二、最长平衡串IO链接

 本题思路:找一个连续的子串, 使得子串中‘0’和‘1’的个数能抵消,利用前缀和a[i]统计前i个字符中有多少个‘1’, 前缀和b[i]统计前i个字符中有多少个‘0’,记该最大连续子串开始地方为 i, 结束地方为 j, 则有a[j]−a[i−1]==b[j]−b[i−1]变形为a[j]−b[j]==a[i−1]−b[i−1],从前往后统计, 记 c 为 a[i]−b[i] 的差值, 用哈希表找到在 i之前的最小a[j]即可。

#include

constexpr int N=1e6+10;

int a[N],b[N];//a[N]用来统计前缀0的和,b[N]用来统计前缀1的和

int main()

{

std::ios::sync_with_stdio(false);

std::cin.tie(nullptr);std::cout.tie(nullptr);

std::string s;

std::cin>>s;

for(int i=1;i<=s.size();i++){

a[i]=a[i-1],b[i]=b[i-1];

if(s[i-1]=='0') a[i]++;

else b[i]++;

}

int res=0;

std::unordered_map hash;

hash[0]=0;

for(int i=1;i<=s.size();i++){

int c = a[i] - b[i];//表示当前1和0之前的数量相差多少

//用哈希表找到在 i之前的最小a[i]

if(hash.count(c)) res = std::max(res, a[i] - a[hash[c]]);

else hash[c] = i;//

}

std::cout<

return 0;

}

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: