
java
class main1 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
//输入数组元素
String[]s=br.readLine().split(" ");
long[]a=new long[n];
for(int i=0;i<n;i++){
a[i]=Long.parseLong(s[i]);
}
//cur记录当前元素和上一个元素相乘的最大值,若改变,则记录当前元素的下标curId
BigInteger max=BigInteger.valueOf(-1);
BigInteger sum=BigInteger.valueOf(0);
int curId=0;
for(int i=1;i<n;i++){
BigInteger curVal=BigInteger.valueOf(a[i]);
BigInteger lastVal=BigInteger.valueOf(a[i-1]);
BigInteger cur=curVal.multiply(lastVal);
if(cur.compareTo(max)>0){
curId=i;
max=cur;
}
sum=sum.add(curVal);
}
BigInteger ans=sum.add(max)
.add(BigInteger.valueOf(a[0]))
.subtract(BigInteger.valueOf(a[curId]))
.subtract(BigInteger.valueOf(a[curId-1]));
System.out.println(ans);
}
}

java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
//输入
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[]a=new int[n];
long sum=0;
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
sum+=a[i];
}
//众数的最大可能出现次数是n/n-1
//n--sum%n==0,所有元素全部相同
//n-1--sum%n!=0,需要舍弃一个元素,剩下n-1个元素全部相同
long ans=0L;
if(sum%n==0){
//n个元素相同,众数出现次数为n
long target=sum/n;
ans=calOps(a,target,-1);
}else{
//n-1个元素相同,众数出现次数为n-1
Arrays.sort(a);
//比较排除最大值/最小值后,哪种情况得到的操作数更小
ans=Math.min(cal(a,sum,0), cal(a,sum,a.length-1));
}
System.out.println(ans);
}
//排除一个元素后,计算最小操作数
private static long cal(int[] a, long sum, int exId) {
sum=sum-a[exId];
long target=sum/(a.length-1);
if(sum%(a.length-1)==0){
//能整除
return calOps(a,target,exId);
}else{
//不能整数,target上下分别取整计算一次
return Math.min(calOps(a,target,exId),calOps(a,target+1,exId));
}
}
//计算 把元素变成target的操作数
private static long calOps(int[] a, long target, int exId) {
long add=0L;
long minus=0L;
for(int i=0;i<a.length;i++){
if(i==exId)continue;//跳过被排除的元素
if(target-a[i]>0){
add+=target-a[i];//累加需要增加的次数
}else{
minus+=a[i]-target;//累计需要减少的次数
}
}
//每次操作可以同时处理一次add和minus,抵消后剩下的差由被排除的元素承担
return Math.max(add,minus);
}
}

java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
//相邻字符都不相等的01串只有两种可能
//0开头,01交替
//1开头,10交替
public class Main {
static boolean isAchieved;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
char[]s=sc.next().toCharArray();
int n=s.length;
int[][][]dp=new int[n][n][2];
int res=0;
//dp[i][j][k]子串i~j变成结尾为k的交替串,需要反转的次数
dp[0][0][s[0]-'0']=0;//结尾是原字符,翻转次数0
dp[0][0][1-s[0]+'0']=1;//结尾是翻转后的字符,翻转次数1
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(i==0&&j==0)continue;//已完成初始化,跳过
int bit=s[j]-'0';//当前字符原始值
//以当前字符结尾,翻转次数等于【i,j-1】结尾为1-bit(和当前位不同)的次数
dp[i][j][bit]=dp[i][j-1][1-bit];
//以当前字符翻转结尾,翻转次数等于【i,j-1】结尾为bit的次数+1(翻转一次)
dp[i][j][1-bit]=dp[i][j-1][bit]+1;
//累加最小值
res+=Math.min(dp[i][j][bit],dp[i][j][1-bit]);
}
}
System.out.println(res);
}
}

java
class main4{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int q=sc.nextInt();
while(q-->0){
double m=sc.nextInt();
double x=sc.nextInt();
if(x%m==0){
System.out.println((int)m);
}else{
System.out.println((int)(x%m));
}
}
sc.close();
}
}

java
class main5{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
while(t-->0){
int n=sc.nextInt();//数组长度
int k=sc.nextInt();//操作次数
//输入数组元素
int[]a=new int[n];
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
}
//加减操作
for(int i=0;i<k;i++){
int u=sc.nextInt();
int v=sc.nextInt();
a[u-1]+=1;
a[v-1]-=1;
}
//判断是否升序
boolean ok=true;
for(int i=1;i<n;i++){
if(a[i]<a[i-1]){
ok=false;
break;
}
}
if(ok) System.out.println("Yes");
else System.out.println("No");
}
sc.close();
}
}

java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.*;
//DP
public class Main {
static final int MOD=1000000007;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
long[]a=new long[n];
long sum=0;
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
sum+=a[i];
}
//dp[i][j]
//从后往前,用j~n-1位置上的数,凑出总和为i的方案总数
long[][]dp=new long[(int)(sum+1)][n+1];
dp[0][n]=1;//凑出0只有一种方案,即空方案
//遍历要凑的总和
for(long i=1;i<=sum;i++){
//倒序遍历数组
//算j前必须先知道j+1的方案
for(int j=n-1;j>=0;j--){
long res=0;
//枚举当前可选的数字
//在当前位置的后面还有n-1-j个位置没处理
//所选的数不能太大,综合推导为i-(n-1-j)
for(long k=1;k<=i-(n-1-j);k++){
if(a[j]==k){//不能选和原数组上的元素一样的数
continue;
}
//剩下的和i-k由j+1位往后凑
//在j位置凑了k,剩下的i-k需要由后面的j+1~n-1去凑
res=(res%MOD+dp[(int)(i-k)][j+1])%MOD;
}
dp[(int)i][j]=res;
}
}
System.out.println(dp[(int)sum][0]);
}
}

|------------------------|----------------------------|------------------------------------|
| 1. 按商家名字的字典序升序输出 | 自动按 key 排序,不用额外写排序代码 | TreeMap(key 是 String,默认按字典序自然排序) |
| 2. 按商家名字分组,每个名字对应多个地址 | 键值对映射:key 是商家名,value 是地址集合 | Map(这里用TreeMap,同时解决排序问题) |
| 3. 同名商家不能重复地址(重复则注册失败) | 地址集合自动去重,重复元素不被添加 | Set(自带去重特性) |
| 4. 要拿到「第一次注册的地址」(主店地址) | 地址集合要保留插入顺序,能快速拿到第一个元素 | LinkedHashSet(按插入顺序保存元素,有序的 Set) |
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String s=sc.nextLine();//读取空行
//外层TreeMap:解决「按名字字典序排序 + 按名字分组」
//内层LinkedHashSet:解决「地址去重 + 保留插入顺序(主店地址)」
//商店名,地址集合
Map<String,Set<String>>map=new TreeMap<>();
for(int i=0;i<n;i++){
String[]meg=sc.nextLine().split(" ");
String meg0=meg[0].toLowerCase();
String meg1=meg[1].toLowerCase();
//确保全小写输入
if(meg0.equals(meg[0])&&meg1.equals(meg[1])){
//getOrDefault如果商家名字不存在就新建一个空的
//LinkedHashSet按插入顺序保存元素,确保第一家是主店后面的是分店
Set<String>addr=map.getOrDefault(meg0,new LinkedHashSet<>());
addr.add(meg1);//set自动去重
map.put(meg0,addr);
}
}
for(Map.Entry<String,Set<String>> entry:map.entrySet()){
System.out.println(entry.getKey()+" "
+entry.getValue().iterator().next()+" "
+(entry.getValue().size()-1));
}
}
}