1、
这个题就是看2的个数,但是需要注意的是:long而不是int
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long n;
n=sc.nextLong();
long[] a=new long[(int) n];
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
}
int res=0;
for(int i=0;i<n;i++){
if(a[i]==1){
continue;
}else{
res+=a[i]/2;
}
}
System.out.println(res);
}
}
2、
思路就是让两个数组的值不断比较大小。一个数组是输入的数字组成的,另一个数组是1-n中未输入的数字。
import java.util.Scanner;
public class Main1 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n,m;
n=sc.nextInt();
m=sc.nextInt();
int[] t=new int[m];
int[] s=new int[n];
for(int i=0;i<n;i++){
s[i]=i+1;
}
for(int i=0;i<m;i++){
t[i]=sc.nextInt();
s[t[i]-1]=0;
}
int[] res=new int[n];
int j=0;
int c=0;
for(int i=0;i<n;){
while(c<n&&j<m){
if(s[c]==0){
c++;
}else{
if(s[c]<t[j]){
res[i]=s[c];
c++;
i++;
}else{
res[i]=t[j];
j++;
i++;
}
}
}
while(c<n){
if(s[c]!=0)
res[i++]=s[c];
c++;
}
while(j<m){
res[i++]=t[j];
j++;
}
}
for(int i=0;i<n;i++){
System.out.print(res[i]);
if(i!=n-1){
System.out.print(" ");
}
}
}
}
3、
这个题当时没有做出来,后来参考别人的做法,dfs+决策树。
首先是如何获取输入值思路上就比较受阻。
一个物品包含三种状态:
1)、分给第一个人
2)、分给第二个人
3)、扔掉
/**
* 网易校招2021
*/
public class Main2Test {
/**
* 决策树+dfs做法
*/
public static int min=Integer.MAX_VALUE;
public static void main(String[] args) {
int[] arr={30,60,5,15,30};
int sum=0;
for(int num:arr){
sum+=num;
}
selectHelper(0,0,0,sum,arr);
System.out.println(min);
}
//用户1当前的总数,用户2当前的总数,第i个物品,总的sum和,arr数组
public static void selectHelper(int user1,int user2,int i,int sum,int[] arr){
if(user1==user2){
min=Math.min(min,sum-user1-user2);
}
if(i>=arr.length){
return ;
}
//做决策
selectHelper(user1+arr[i],user2,i+1,sum,arr);
selectHelper(user1,user2+arr[i],i+1,sum,arr);
selectHelper(user1,user2,i+1,sum,arr);
}
}
4、
这个题暂时没有思路