您的位置:首页 > 编程语言

【ACM】P2020、P2021、P2022、P2023、P2024代码演示

2017-05-16 09:14 555 查看

【P2020问题概述】绝对值排序 :

/*** 绝对值排序
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 79949    Accepted Submission(s): 38091

Problem Description
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。

Input
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。

Output
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。

Sample Input
3 3 -4 2
4 0 1 2 -3
0

Sample Output
-4 3 2
-3 2 1 0

Author
lcy

*/


代码演示:

package ac;

import java.util.Arrays;
import java.util.Scanner;

public class P2020{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in   );
while(sc.hasNext()){
//接收n
int n=sc.nextInt();
if(n==0){
break;
}
//new 原数组
int[] a=new int
;
for(int i=0;i<a.length;i++){
a[i]=sc.nextInt();
}
//new 绝对值后的数组
int[] b =new int
;
for(int i=0;i<b.length;i++){
if(a[i]<0){
b[i]=Math.abs(a[i]);
}else{
b[i]=a[i];
}
}
//排序绝对值数组
Arrays.sort(b);
//从原数组中找到与绝对值数组中对应的数值
for(int i=0;i<b.length;i++){
for(int j=0;j<a.length;j++){
if(-a[j]==b[i]){
b[i]=a[j];
}
}
}
//打印出整个数组
for(int i=b.length-1;i>=0;i--){
if(i==b.length-1){
System.out.print(b[i]);
}else{
System.out.print(" "+b[i]);
}
}
System.out.println();
}
}
}


【P2021问题概述】发工资咯:)

/**
* 发工资咯:)
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 61443    Accepted Submission(s): 33152

Problem Description
作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵
但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。

Input
输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n个老师的工资。
n=0表示输入的结束,不做处理。

Output
对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。

Sample Input
3
1 2 3
0

Sample Output
4

Author
lcy

Source
C语言程序设计练习(四)

*/


代码演示:

package ac;

import java.util.Scanner;

public class P2021 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in    );
//可以有多测试实例用while
while(sc.hasNext()){
//接收数据n
int n=sc.nextInt();
if(n==0){
break;
}
//用数组接收n个数据
int[] a=new int
;
int count=0;
for(int i=0;i<a.length;i++){
a[i]=sc.nextInt();
//依次对百位、十位、个位的数字进行判断,确定每个位置上的总数
int x=a[i]/100;
int y=a[i]%100/10;
int z=a[i]%100%10;
if(y>5){
y=1+y-5;
}else if(y==5){
y=1;
}
if(z>5){
z=1+ ((z-5)%2==0?(z-5)/2:1+(z-5)/2);
}else if(z<5){
z=z%2==0?z/2:z/2+1;
}else{
z=1;
}
count+=x+y+z;
//System.out.println(x+","+y+","+z);
}
System.out.println(count);
}
}
}


【P2022问题概述】海选女主角:

/**
* 海选女主角
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 62591    Accepted Submission(s): 27633

Problem Description
potato老师虽然很喜欢教书,但是迫于生活压力,不得不想办法在业余时间挣点外快以养家糊口。
“做什么比较挣钱呢?筛沙子没力气,看大门又不够帅...”potato老师很是无奈。
“张艺谋比你还难看,现在多有钱呀,听说还要导演奥运开幕式呢!你为什么不去娱乐圈发展呢?”lwg在一旁出主意。
嗯,也是,为了生存,就委屈点到娱乐圈混混吧,马上就拍一部激光电影《杭电记忆——回来我的爱》。
说干就干,马上海选女主角(和老谋子学的,此举可以吸引媒体的眼球,呵呵),并且特别规定,演员必须具有ac的基本功,否则直接out!
由于策划师风之鱼(大师级水王)宣传到位,来应聘的MM很多,当然包括nit的蛋糕妹妹等呼声很高的美女,就连zjut的jqw都男扮女装来应聘(还好被安全顾问hdu_Bin-Laden认出,给轰走了),看来娱乐圈比acm还吸引人哪...
面试那天,刚好来了m*n个MM,站成一个m*n的队列,副导演Fe(OH)2为每个MM打了分数,分数都是32位有符号整数。
一开始我很纳闷:分数怎么还有负的?Fe(OH)2解释说,根据选拔规则,头发染成黄色、化妆太浓、穿的太少等等都要扣分数的,扣的多了就可能是负分了,当然,如果发现话语中夹有日语,就直接给-2147483648分了。
分数送上来了,是我做决定的时候了,我的一个选拔原则是,要选一个面试分数绝对值(必须还是32位整数)最大的MM。
特别说明:如果不幸选中一个负分的MM,也没关系,因为我觉得,如果不能吸引你,那要想法恶心你。

Input
输入数据有多组,每组的第一行是两个整数m和n,表示应聘MM的总共的行列数,然后是m行整数,
每行有n个,m和n的定义见题目的描述。

Output
对于每组输入数据,输出三个整数x,y和s,分别表示选中的MM的行号、列号和分数。
note:行号和列号从一开始,如果有多个MM的分数绝对值一样,那么输出排在最前面的一个
(即行号最小的那个,如果行号相同则取列号最小的那个)。

Sample Input
2 3
1 4 -3
-7 3 0

Sample Output
2 1 -7

Author
lcy

*/


代码演示:

package ac;

import java.util.Scanner;

/**
*
*@author <a"283505495@qq.com">lxd</a>
*@version 1.0 2017-5-18 上午8:26:25
*@fileName P2022.java
*/
public class P2022 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//输入数据有多组实例
while(sc.hasNext()){
//接收m,n
int m=sc.nextInt();
int n=sc.nextInt();
//接收m行n列数据到a数组中
int[][] a=new int[m]
;
//初始化max,位置(mi,mj)
int max=a[0][0];
int mi=0,mj=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
a[i][j]=sc.nextInt();
//利用绝对值比较
if(Math.abs(a[i][j])>max){
max=Math.abs(a[i][j]);
mi=i;
mj=j;
}
}
}
System.out.println((mi+1)+" "+(mj+1)+" "+a[mi][mj]);
}
}
}


【P2023问题概述】:求平均成绩

/**
* 求平均成绩
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 124329    Accepted Submission(s): 28436

Problem Description
假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,
并输出各科成绩均大于等于平均成绩的学生数量。

Input
输入数据有多个测试实例,每个测试实例的第一行包括两个整数n和m,分别表示学生数和课程数。
然后是n行数据,每行包括m个整数(即:考试分数)。

Output
对于每个测试实例,输出3行数据,第一行包含n个数据,表示n个学生的平均成绩,结果保留两位小数;
第二行包含m个数据,表示m门课的平均成绩,结果保留两位小数;第三行是一个整数,
表示该班级中各科成绩均大于等于平均成绩的学生数量。
每个测试实例后面跟一个空行。

Sample Input
2 2
5 10
10 20

Sample Output
7.50 15.00
7.50 15.00
1

Author
lcy

*/


代码演示:

package ac;

import java.util.Scanner;

public class P2023{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int m=sc.nextInt();
double[][] a=new double[n+2][m+1];
//int[][] a=new int[n+2][m+1];
for(int i=0;i<a.length-2;i++){
for(int j=0;j<a[i].length-1;j++){
a[i][j]=sc.nextInt();
//n个学生的总成绩
a[i][a[i].length-1]+=a[i][j];//注意此处遇到过一个坑:a[i][a.length-1]+=a[i][j];
//m科总成绩
a[a.length-2][j]+=a[i][j];
//m科平均成绩
a[a.length-1][j]=a[a.length-2][j]/(i+1);
}
}

//打印出n个学生的成绩
for(int i=0;i<a.length-2;i++){
if(i==0){
System.out.print("");
}else{
System.out.print(" ");
}
System.out.printf("%.2f",a[i][a[i].length-1]/m);
}
System.out.println();
//打印出m个平均成绩
for(int j=0;j<a[0].length-1;j++){
if(j==0){
System.out.print("");
}else{
System.out.print(" ");
}
System.out.printf("%.2f",a[a.length-1][j]);
}
System.out.println();
/**打印出高于平均成绩的人数count
思路:
统计每科高于平均成绩的科目数k,如果k==m,则count++
*/
int count=0;
for(int ii=0;ii<a.length-2;ii++){
int k=0;
for(int j=0;j<a[ii].length-1;j++){
if(a[ii][j]>=a[a.length-1][j]){
k++;
}
}
if(k==m){
count=count+1;
}
}
System.out.println(count);
System.out.println();
}
}
}


运行结果:


[P2024问题概述]:C语言合法标识符

/**
* C语言合法标识符
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 72031    Accepted Submission(s): 27939

Problem Description
输入一个字符串,判断其是否是C的合法标识符。

Input
输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串。

Output
对于每组输入数据,输出一行。如果输入数据是C的合法标识符,则输出"yes",否则,输出“no”。

Sample Input
3
12ajf
fi8x_a
ff  ai_2

Sample Output
no
yes
no

Author
lcy

*
*/


代码演示:

package ac;
import java.util.Scanner;

public class P2024{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//接收所测试的行数
int n=sc.nextInt();
//吸收多余的输入
sc.nextLine();
//判断n行字符串
for(int j=0;j<n;j++){
//接收字符串
String str=sc.nextLine();
//处理字符
char[] chs=str.toCharArray();
//是否为标记符
boolean flag=false;
char ch=str.charAt(0);
//判断第一个字符是否符合规则
if(ch>='a'&&ch<='z'|| ch>='A'&&ch<='Z'||ch=='_'    ){
//判断n-1个字符是否符合规则
for(int i=1;i<chs.length;i++){
if(chs[i]>='a'&&chs[i]<='z'|| chs[i]>='A'&&chs[i]<='Z'|| chs[i]>='0'&&chs[i]<='9'|| chs[i]=='_'  ){
flag=true;
continue;
//System.out.print("【"+chs[i]+"】");
}else{
flag=false;
break;
//System.out.print("《"+chs[i]+"》");
}
}
}else{
flag=false;
}

//按照flag值输出判断结果
if(flag){
System.out.println("yes");
}else{
System.out.println("no");
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: