T1和T2很简单就不写了。
2020.9.6
/**
* 式子求值
* 对于序列a下标从1开始到n
* 定义一个式子:bi=ai⊕⊕{j=1,n}(i%j)
* 求⊕{i=1,n}(bi)的值
* ⊕是异或运算
* bi = ai⊕(i%1)⊕(i%2)⊕(i%3)...⊕(i%n)
* n<=100000,0<=ai<=n(此处感觉有问题。。。因为样例与这个矛盾。问他们说自己理解。。)
*
* b1 = a1⊕(1%1)⊕(1%2)⊕(1%3)...⊕(1%n)
* b2 = a2⊕(2%1)⊕(2%2)⊕(2%3)...⊕(2%n)
* ...
* 因为异或运算满足交换律的,从这里可以看出,就是对于(1~n)%1⊕(1~n)%2....的值和a的异或
* 于是就可以计算出异或值后,(1~n)%i如果是偶数就为arr[n%i]的值,否则就是arr[n%i]的值异或arr[i-1]的值
* emmm感觉还是看程序自己领会一下吧。。
*/
import java.util.Scanner;
public class T3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a[] = new int[n+1];
int ans = 0;
for(int i = 1;i<=n;i++) {
a[i] = sc.nextInt();
ans^=a[i];
}
int arr[] = new int[100005];
for(int i = 1;i<100005;i++) {
arr[i] = i^arr[i-1];
}
for(int i = 1;i<=n;i++) {
ans^=arr[n%i]^arr[i*((n/i)%2)==0?0:i*((n/i)%2)-1];
}
System.out.println(ans);
}
}
import java.util.Arrays;
import java.util.Scanner;
/**
* 第四题
* 公司有n(n<24)个人,对于每个人只能有一个直系上司
* 对于每个人他的下属和他自己的总数是ai
* 问能否构成一个关系满足,
* 每个人最少有两个下属,或者没有下属。
* 对于除最高职位的人,都有且只有一个直系上司。
* 问能否根据ai建立关系树。
*
* 就是一个搜索加上回溯问题,把最高的当做根节点,然后找到和为父节点的值,将这几个当为父节点,进行递归处理。
* 如果对于排序好的,从高到底的安排节点,不进行回溯,能过45%。会丧失对于较大的节点是另外更大节点的儿子节点,能够组成数的情况。
*
*/
public class T4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int arr[] = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
Arrays.sort(arr);
boolean flag = sl(arr[arr.length - 1], 0, 0, arr);
if (flag) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
static boolean sl(int f, int z, int used, int arr[]) {
int sum = 0;
int cont = 0;
if(f==1) {
return true;
}
int use = used;
for (int j = arr.length - 2; j >= 0; j--) {
for (int i = j; i >= 0; i--) {
if ((use & (1 << i)) == 0 && sum + arr[i]+1 <= f) {
sum += arr[i];
use |= (1 << i);
z |= (1 << i);
cont++;
if (sum + 1 == f) {
break;
}
}
}
if (sum + 1 != f) {
return false;
}
boolean flag = false;
if (cont > 1) {
for (int i = 1; i < arr.length; i++) {
if ((z & 1 << i) != 0) {
if (arr[i] != 1) {
flag = sl(arr[i], 0, use, arr);
if (!flag) {
break;
}
} else {
use |= 1 << i;
}
}
}
}else {
return false;
}
// for(int i = 1;i<arr.length;i++) {
// if((use&(1<<i))==0) {
// return false;
// }
// }
}
return true;
}
}
/*
* 3 1 1 3 2 1 2
*
* YES NO
*/
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
/**
* 第二部分题
* 就是对于m次点名每次把队列中的人叫到第一个,把没在队列的添到第一个。
* 问队列的学生的编号
* 这个把点名倒过来就行了。。。
* 最后点的一定在最前面。然后在前面再次出现就不用管了。。。就行了。
*/
public class T1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int a[] = new int[m];
while(m-->0) {
a[m] = sc.nextInt();
}
HashSet<Integer> hs = new HashSet<Integer>();
ArrayList<Integer> al = new ArrayList<Integer>();
for(int i = 0;i<a.length;i++) {
if(!hs.contains(a[i])) {
al.add(a[i]);
hs.add(a[i]);
}
}
for (Integer integer : al) {
System.out.println(integer);
}
}
}