http://hihocoder.com/contest/offers47/problems
题目1 : 删除树节点
模拟一遍,维持map根据parent node查找child node
package l471;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt(),k=sc.nextInt();
int[]a=new int[1+n];
for(int i=1;i<=n;i++)a[i]=sc.nextInt();
int[]p=new int[n+1];
Map>map=new HashMap>();
for(int i=1;i<=n;i++) {
p[i]=sc.nextInt();
if(!map.containsKey(p[i])) map.put(p[i], new HashSet());
map.get(p[i]).add(i);
}
for(int i=1;i<=n;i++) {
if(a[i]
题目3 : 公平分队II
1.Hi一开始一定要尽量均分,然后交换最多能带来2N-2的增益,如果不均分,即使交换有2N-1的增益,那也最多跟均分一样
2.如果不能均分,则尽量差别不大,比如N=3,可以有2中分法:
1 4 5 && 2 3 6
1 4 6 && 2 3 5
2种情况如果Ho选大的,Hi最后交换都会得到4 5 6
如果Ho选小的,反而Hi最后交换后得到的都是3 5 6
同理,Hi必须这样分得差别不大
写出来其实代码是一样的
package l472;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
if(n==1) {
System.out.println(2);
return;
}
long nn=n;
long sum=(1+2*nn)*nn;
System.out.println(sum/2+(2*n-2));
}
}