题目:
链接:https://ac.nowcoder.com/acm/contest/68536/C
题目描述
给定一个圆和n条直线,现在需要使用这n条线尽可能地把圆分成多份,问使用n条线最多能把圆分成几份?
输入描述:
第一行给定一个正整数T,代表数据组数。(T<=1e5)。
接下来T行,每行一个非负整数,代表线的数量。(<=1e6)
输出描述:
共T行,每行一个整数,代表n条线最多能把圆分成几份。
示例1
输入
2
4
2
2
4
输出
11
4
11
核心:该题核心就是等差数列的性质
要想把圆分成的块数最多,那么增加的每一条线都不能过前面所有的交点。
圆面本身是一个部分;
第一条直线只能穿过圆面本身这一个部分,画第一条直线时圆面加一个部分,最多分成1+1=2 块;
第二条直线只能穿过两个部分,画第二条直线时圆面加两个部分,最多分成1+(1+2)=4 块;
第三条直线只能穿过三个部分,画第三条直线时圆面加三个部分,最多分1+(1+2+3)=7 块;
依次类推可得,n条直线,最多分成1+(1+2+3+4+…+n) 块
即n*(n+1)/2+1 块。(等差数列求和)
————————————————
原文链接:https://blog.csdn.net/m0_61465701/article/details/122484039
详细代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t=sc.nextInt();boolean flag=true;int count=0;long sum=0;
while(flag){
long n=sc.nextLong();
sum=n*(n+1)/2+1;
System.out.println(sum);
count++;
if(count==t) flag=false;
}
}
}
选择排序:
代码如下:
<script>
let arr=[2,6,1,77,52,25,7];
for(let i=0;i<arr.length;i++){
for(let j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
let mid =arr[i];
arr[i]=arr[j];
arr[j]=mid;
}
}
}
document.write(arr);
</script>
就上述代码为例:
与冒泡排序进行类比,其本质含义相同的。i可以当作循环的趟数来理解。
当i==0时,j 此时从索引1开始与arr[0]进行比较(索引0开始到结束),如果有比前一个大数值,则进行交换位置,目的把最小值往前放,一趟下来,数组的第一个值已经确定好了。依次进行下一趟,直到进行最后一个数也排好。(注:第二个for循环的j=i+1是核心的步骤)
此处的j解释为位于下标i元素后的元素的下标。当进行每一趟冒泡循环时,取出的目标元素总是要拿去与其后的每一个元素进行比较(例如,i=0时下标为0的元素为目标元素拿出,将其与下标为1-9的元素进行比较),所以j的起始值为i+1.