ZJNU 1542 - 三角形(续)--中高级

从小到大排序后

先固定一遍,另外两边递增查找

即固定 i,j=i+1,k=j+1

然后让k递增到 a[i]+a[j]<=a[k] 时

此时不能凑成一个三角形

答案增加 k-1-j 组

此时不需要重置 k=j+1

因为 j++ 后 a[j] 会变大

那么在 j~k 之间的所有木棍长度均能再次满足这种 ij 组合

此时只需要把前一个状态的 k 继续往后查找即可

如果 k 查找到了最后,因为i固定,可得 j 不断向后移动,最后能增加的组合有 (n-j)*(n-j-1)/2 组,结束 j 循环,i++

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int ar[2010];
 5 int main()
 6 {
 7     ios::sync_with_stdio(0);
 8     cin.tie(0);cout.tie(0);
 9     int T,n,i,j,k,ans,d;
10     cin>>T;
11     while(T--)
12     {
13         cin>>n;
14         for(i=1;i<=n;i++)
15             cin>>ar[i];
16         sort(ar+1,ar+n+1);
17         ans=0;
18         for(i=1;i<=n-2;i++)
19         {
20             k=i+2;
21             for(j=i+1;j<=n-1;j++)
22             {
23                 d=ar[i]+ar[j];
24                 while(k<=n&&d>ar[k])
25                     k++;
26                 ans+=k-1-j;
27                 if(k>n)
28                 {
29                     ans+=(n-j)*(n-j-1)/2;
30                     break;
31                 }
32             }
33         }
34         cout<<ans<<endl;
35     }
36
37     return 0;
38 }

原文地址:https://www.cnblogs.com/stelayuri/p/12236196.html

时间: 2024-10-11 18:42:47

ZJNU 1542 - 三角形(续)--中高级的相关文章

ZJNU 1262 - 电灯泡——中高级

在影子没有到达墙角前,人越远离电灯,影子越长,所以这一部分无需考虑 所以只需要考虑墙上影子和地上影子同时存在的情况 因为在某一状态存在着最值 所以如果以影子总长与人的位置绘制y-x图像 会呈一个类似y=-x^2函数的图像 所以就可以根据三分法找出最值点 1 /* 2 Written By StelaYuri 3 */ 4 #include<stdio.h> 5 double H,h,D; 6 double len(double lh){ 7 return lh+D*(h-lh)/(H-lh);

ZJNU 1310 - 排队——中高级

蒟蒻做法:追踪1号队员,取他回到原来位置需要的次数 1 /* 2 Written By StelaYuri 3 */ 4 #include<stdio.h> 5 int main(){ 6 int T,t,n,ans,x; 7 scanf("%d",&T); 8 for(t=1;t<=T;t++){ 9 scanf("%d",&n); 10 ans=x=1; 11 while(x!=n+1){ 12 if(x>n) 13 x=

ZJNU 1535 - 新建的大楼--中高级

因为从俯视图看,输入输出的视角是从右下方看向左上方的 所以左上角的正方体最有可能被其他正方体挡住 立体上,底部的正方体最有可能被顶部的正方体挡住 所以绘图应该从后往前,从下往上绘制 剩下的就是一大堆计算和判断了 采用的是先绘制出规范的图再与输入的图做对比的方式 1 /* 2 Written By StelaYuri 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 int n,m,ar[21][21]; 7 char ori[200][

BZOJ2458 [BeiJing2011]最小三角形

Description Xaviera现在遇到了一个有趣的问题. 平面上有N个点,Xaviera想找出周长最小的三角形. 由于点非常多,分布也非常乱,所以Xaviera想请你来解决这个问题. 为了减小问题的难度,这里的三角形也包括共线的三点. Input 第一行包含一个整数N表示点的个数. 接下来N行每行有两个整数,表示这个点的坐标. Output 输出只有一行,包含一个6位小数,为周长最短的三角形的周长(四舍五入). Sample Input 4 1 1 2 3 3 3 3 4 Sample

Directx11学习笔记【十】 画一个简单的三角形

本篇笔记要实现的是在屏幕上渲染出一个三角形,重点要学习的是渲染一个几何体的流程方式. 为了渲染几何图形,需要一个顶点缓存和一个描述顶点布局的输入层,还有着色器(主要是顶点着色器和像素着色器),下面来看看具体Demo的实现. 新建一个Win32项目 ,新建一个类我们叫做TriangleDemo,继承自前面教程我们实现的基类Dx11DemoBase. TriangleDemo.h头文件 #pragma once #include "Dx11DemoBase.h" class Triangl

HDU——1874畅通工程续(邻接矩阵弗洛伊德)

畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 41849    Accepted Submission(s): 15463 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走

胜利大逃亡(续)(状态压缩bfs)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7357    Accepted Submission(s): 2552 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带

数字三角形

数字三角形必须经过某一个点,使之走的路程和最大 输入格式: 第1行n,表示n行 (n<=25), 第2到n+1行为每个的权值,第n+2行为两个数x,y表示必须经过的点 输出格式: 输出最大值 样例1 输入: 2 1 1 1 1 1 输出: 2 //11 月 23 日 2015 #include <stdio.h> int num[26][26];//存储数字三角形的权值 int route[26][2];//记录临时最优路径 int n; int s1,s2;//以特殊点分为上半段和下半

KEY操作续

[KEY操作续] 1.UMP key 序列化给定 key ,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为 Redis 键. 序列化生成的值有以下几个特点: 它带有 64 位的校验和,用于检测错误, RESTORE 在进行反序列化之前会先检查校验和. 序列化的值不包括任何生存时间信息. 返回值: 如果 key 不存在,那么返回 nil . 否则,返回序列化之后的值. 2.FLUSHDB 清空当前数据库中的所有 key. 此命令从不失败. 3.DBSIZE 返回当前数据库的