寒假12:黑白无常、数的统计、友好数

 

算法训练 黑白无常  

时间限制: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

主要是找正确的,因为正确的人说的话是一样的,所以说真假的个数应该是一样的。代码:

 

 

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。

代码:

 

 

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

 

分别算下就是的,代码:

 

 

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");
				}
			}
		}
	}
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值