算法训练 黑白无常
时间限制:1.0s 内存限制:256.0MB
问题描述
某寝室的同学们在学术完之后准备玩一个游戏:游戏是这样的,每个人头上都被贴了一张白色或者黑色的纸,现在每个人都会说一句话“我看到x张白色纸条和y张黑色的纸条”,又已知每个头上贴着白色纸的人说的是真话、每个头上贴着黑色纸的人说的是谎话,现在要求你判断哪些人头上贴着的是白色的纸条,如果无解输出“NoSolution.”;如果有多组解,则把每个答案中贴白条的人的编号按照大小排列后组成一个数(比如第一个人和第三个人头上贴着的是白纸条,那么这个数就是13;如果第6、7、8个人都贴的是白纸条,那么这个数就是678)输出最小的那个数(如果全部都是黑纸条也满足情况的话,那么输出0)
输入格式
第一行为一个整数n,接下来n行中的第i行有两个整数x和y,分别表示第i个人说“我看到x张白色纸条和y张黑色的纸条”。
输出格式
一行。如果无解输出“NoSolution.”。否则输出答案中数值(具体见问题描述)最小的那个,如果全部都是黑纸条也满足情况的话,那么输出0
样例输入
2
1 0
1 0
样例输出
0
样例输入
5
3 1
0 4
1 3
4 0
1 3
样例输出
35
数据规模和约定
n<=8
主要是找正确的,因为正确的人说的话是一样的,所以说真假的个数应该是一样的。代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import java.util.Scanner;
public class Main {
public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); int[][] data=new int[n][3]; int[][] arr=new int[n][2]; int t=0; for (int i = 0; i < n; i++) { int a=sc.nextInt(); int b=sc.nextInt(); arr[i][0]=a; arr[i][1]=b; boolean fa=true; for (int j = 0; j < n; j++) { if(data[j][0]==a&&data[j][1]==b){ data[j][2]++; fa=false; break; } } if(fa){ data[t][0]=a; data[t][1]=b; data[t][2]=1; t++; } }
for (int i = 0; i < n; i++) { if(data[i][2]>1){ int count=0; String str=""; for (int j = 0; j < n; j++) { if(arr[j][0]==data[i][0]&&arr[j][1]==data[i][1]){ str=str+(j+1); count++; } } if(count!=n){ System.out.println(str); }else System.out.println(0); return; } } System.out.println("NoSolution."); } } }
|
算法训练 数的统计
时间限制:1.0s 内存限制:256.0MB
问题描述
在一个有限的正整数序列中,有些数会多次重复出现在这个序列中。
如序列:3,1,2,1,5,1,2。其中1就出现3次,2出现2次,3出现1 次,5出现1次。
你的任务是对于给定的正整数序列,从小到大依次输出序列中出现的数及出现的次数。
输入格式
第一行正整数n,表示给定序列中正整数的个数。
第二行是n 个用空格隔开的正整数x,代表给定的序列。
输出格式
若干行,每行两个用一个空格隔开的数,第一个是数列中出现的数,第二个是该数在序列中出现的次数。
样例输入
12
8 2 8 2 2 11 1 1 8 1 13 13
样例输出
1 3
2 3
8 3
11 1
13 2
数据规模和约定
数据:n<=1000;0<x<=1000,000。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| import java.util.Scanner;
public class Main {
static int[][] data=new int[10000][2]; public static void main(String[] args) { for (int i = 0; i <10000; i++) { data[i][0]=-1; data[i][1]=0; } Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); int t=0; for (int i = 0; i < n; i++) { int k=sc.nextInt(); boolean fa=true; for (int j = 0; j < n; j++) { if(data[j][0]==k){ data[j][1]++; fa=false; break; } } if(fa){ data[t][0]=k; data[t][1]=1; t++; } } //排序 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if(data[i][0]<data[j][0]){ int m=data[i][0]; data[i][0]=data[j][0]; data[j][0]=m; int p=data[i][1]; data[i][1]=data[j][1]; data[j][1]=p; } } } for (int i = 0; i < n; i++) { if(data[i][1]!=0) System.out.println(data[i][0]+" "+data[i][1]); } } } }
|
算法训练 友好数
时间限制:1.0s 内存限制:256.0MB
问题描述
有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的。例如:
9的约数和有:1+3=4
4的约数和有:1+2=3
所以9和4不是友好的。
220的约数和有:1 2 4 5 10 11 20 22 44 55 110=284
284的约数和有:1 2 4 71 142=220
所以220和284是友好的。
编写程序,判断两个数是否是友好数。
输入格式
一行,两个整数,由空格分隔
输出格式
如果是友好数,输出”yes”,否则输出”no”,注意不包含引号。
样例输入
220 284
样例输出
yes
数据规模和约定
两个整数都小于10000
分别算下就是的,代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import java.util.Scanner;
public class Main {
public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int num1=sc.nextInt(); int num2=sc.nextInt(); int n1=0,n2=0; for (int i = 1; i < num1; i++) { if(num1%i==0) n1+=i; } if(n1!=num2){ System.out.println("no"); return; }else{ for (int i = 1; i < num2; i++) { if(num2%i==0) n2+=i; } if(n2==num1){ System.out.println("yes"); }else{ System.out.println("no"); } } } } }
|