算法训练 黑白无常
时间限制: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");
}
}
}
}
}