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

一时间脑抽,打了简单的比赛,用用java写点ACM程序,好用不好用就这样了

2017-04-15 17:18 381 查看
今天,看见学弟们兴致勃勃的打一个模拟赛,很有兴趣就来试一试了!

我的水平也就止于模拟题,模拟模拟就完了

Problem A: 两只老虎

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 324  Solved: 203

SubmitWeb
Board

Description

来,我们先来放松下,听听儿歌,一起“唱”。 

两只老虎两只老虎,跑得快跑得快。

一只没有耳朵,一只没有尾巴。

真奇怪,真奇怪。 

Tmk也觉得很奇怪,因为在他面前突然出现了一群这样的老虎,有的没耳朵,有的没尾巴,不过也有正常的。

现在Tmk告诉你这群老虎的耳朵个数,尾巴条数,以及老虎的腿的数目,问你有多少只是正常的。

其中只有三种老虎:

第一种(正常的):有2个耳朵、1条尾巴、4条腿

第二种(没耳朵):有0个耳朵、1条尾巴、4条腿

第三种(没尾巴):有2个耳朵、0条尾巴、4条腿

Input

第一行一个整数T表示有多少组样例。

接下来每一行一个样例:

包含三个整数a,b,c表示总共有a个耳朵,b条尾巴,c(<=4000)条腿,数据保证有解。

Output

对于每组样例输出一行,表示有多少只正常的老虎。

Sample Input

112 7 40

Sample Output

3

这是一个有点意思的模拟题吧,我仔细思考很久,感觉不知道乱想什么!
package test20170415;

import java.util.Scanner;

public class Main1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int x;
int y;
int z;
while((n--)>0){
x = input.nextInt();
y = input.nextInt();
z = input.nextInt();
System.out.println(tiger(x, y, z));
}
input.close();
}
public static int tiger(int x,int y,int z){
x = x/2;
z = z/4;
if(x>y){
return y-(z-x);
}else{
return x-(z-y);
}

}
}


Problem C: 我是ACMer

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 295  Solved: 204

SubmitWeb
Board

Description

一位优秀ACMer应该掌握的知识点
  时间复杂度(渐近时间复杂度的严格定义,NP问题,时间复杂度的分析方法,主定理)
    排序算法(平方排序算法的应用,Shell排序,快速排序,归并排序,时间复杂度下界,三种线性时间排序,外部排序)
    数论(整除,集合论,关系,素数,进位制,辗转相除,扩展的辗转相除,同余运算,解线性同余方程,中国剩余定理)
    指针(链表,搜索判重,邻接表,开散列,二叉树的表示,多叉树的表示)
    按位运算(and,or,xor,shl,shr,一些应用)
    图论(图论模型的建立,平面图,欧拉公式与五色定理,求强连通分量,求割点和桥,欧拉回路,AOV问题,AOE问题,最小生成树的三种算法,最短路的三种算法,标号法,差分约束系统,验证二分图,Konig定理,匈牙利算法,KM算法,稳定婚姻系统,最大流算法,最小割最大流定理,最小费用最大流算法)
    计算几何(平面解几及其应用,向量,点积及其应用,叉积及其应用,半平面相交,求点集的凸包,最近点对问题,凸多边形的交,离散化与扫描)
    数据结构(广度优先搜索,验证括号匹配,表达式计算,递归的编译,Hash表,分段Hash,并查集,Tarjan算法,二叉堆,左偏树,斜堆,二项堆,二叉查找树,AVL,Treap,Splay,静态二叉查找树,2-d树,线段树,二维线段树,矩形树,Trie树,块状链表)
    组合数学(排列与组合,鸽笼原理,容斥原理,递推,Fibonacci数列,Catalan数列,Stirling数,差分序列,生成函数,置换,Polya原理)
    概率论(简单概率,条件概率,Bayes定理,期望值)
    矩阵(矩阵的概念和运算,二分求解线性递推方程,多米诺骨牌棋盘覆盖方案数,高斯消元)
    字符串处理(KMP,后缀树,有限状态自动机,Huffman编码,简单密码学)
    动态规划(单调队列,凸完全单调性,树型动规,多叉转二叉,状态压缩类动规,四边形不等式)
    博奕论(Nim取子游戏,博弈树,Shannon开关游戏)
    搜索(A*,ID,IDA*,随机调整,遗传算法)
    微积分初步(极限思想,导数,积分,定积分,立体解析几何)

为了表达你学习算法的决心,根据输入的整数,输出若干遍口号”I am a good ACMer“。

Input

本题为多实例测试,首先输入一个整数 n<1000,然后输入n个正整数num(num<1000000)。

Output

输出num对10求余结果次数遍"I am a good ACMer",每一句输出占一行。每一组输出之间有一个空行

Sample Input

31632017

Sample Output

I am a good ACMerI am a good ACMerI am a good ACMerI am a good ACMerI am a good ACMerI am a good ACMerI am a good ACMerI am a good ACMerI am a good ACMerI am a good ACMerI
am a good ACMer

这是一个十足的水题,简单就完了
package test20170415;

import java.util.Scanner;

public class Main3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
while((n--)>0){
int x = input.nextInt();
x=x%10;
while((x--)>0){
System.out.println("I am a good ACMer");
}
System.out.println();
}
input.close();
}
}


Problem D: 爬楼梯

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 281  Solved: 140

SubmitWeb
Board

Description

小时候,我只能一阶一阶得爬楼梯,

后来,我除了能一次爬一阶,还可以一次爬两阶,

到现在,我最多一次可以爬三阶。

那么现在问题来了,我想爬上n层楼,相邻楼层之间有一段楼梯,虽然我一次可以爬1个台阶、2个台阶和3个台阶,但是我在i与i+1层之间的楼梯上时,我不能跨越到i+1与i+2层之间的楼梯。现在有个n层的楼,知道每一段楼梯的阶数,我想知道,如果我只会往上走,并且忽略其他不在楼梯上的其他移动,共有多少种方案可以到达第n层。

Input

第一行一个整数T(0<T<=50)表示有多少组样例。

对于每一组样例:

第一行一个n(1<n<=50)表示有多少层楼。

接下来一行,包括n-1个整数xi(0<xi<=20),由下到上依次表示每段楼梯的长度。

Output

对于每组数据,输出一行表示共有多少种方案。由于答案较大,所以输出答案请对10007取模。

Sample Input

22344 5 6

Sample Output

42184

HINT

这个题稍微有点难度,如果做过类似的题,很快就AC了,是一个DP,fun[i] = fun[i-1]+fun[i-2]+fun[i-3]; 注意,使用打表法,速度会快一点(java快的我肺疼)

需要注意是“乘法”,再次脑抽的我,在加法上错了很久,简直了。。。
package test20170415;

import java.util.Scanner;

public class Main4 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
long[] fun = new long[21];
fun[1]=1;fun[2]=2;fun[3]=4;
for (int i = 4; i < 21; i++) {
fun[i] = fun[i-1]+fun[i-2]+fun[i-3];
}
while((n--)>0){
long sum = 1;
int m = input.nextInt();
while((m--)>1){
int num = input.nextInt();
sum=(sum*fun[num])%10007;
}
System.out.println(sum);
}
input.close();
}
}


Problem E: 只有通过毁灭才能揭示真理

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 242  Solved: 183

SubmitWeb
Board

Description

“只有通过毁灭才能揭示真理。” —— 虚空之眼 

维克兹是一个有触手的虚空来客,他带着非凡的意图探索着符文之地:吸收掉所有知识。凭借着他不断地注视,维克兹可以发射瓦解光线来灭除并分析他途中的一切东西,并为他供给数量庞大的信息。没人知道他为什么需要如此多的材料,尽管有人推测他设法了解符文之地,是为了加速它的毁灭。 

另外,维克兹本身也是一个极其强大的魔法师,他的技能会对命中的敌人施加有机体解构效果。如果累积到3层效果,敌人就会受到爆发性的真实伤害。 

现在,维克兹正准备施展他的绝招 —— 生命形态瓦解射线,来对付被永久眩晕且没有携带任何魔抗装备的约德尔人。另外,他的绝招每10秒就可以对敌人累积一层有机体解构效果。 

维克兹希望找到能够跟他一起遨游大陆的伙伴,所以他准备考考你,如果已知生命形态瓦解射线持续的时间和每一秒的伤害,以及有机体解构效果每累积到3层所爆发的伤害(伤害爆发后层数归零),你是否能算出约德尔人受到的总伤害是多少呢? 

请注意,如果你回答不出来,维克兹绝对很乐意将你一起分解掉。

Input

输入包括T组数据,每组数据包括生命形态瓦解射线的持续时间A,每一秒的伤害B,以及有机体解构效果每累积到3层所爆发的伤害C。

(T <= 10000, 0 <= A, B, C <= 10000, 所有数据皆为整数)

Output

输出一个数代表约德尔人受到的总伤害。

Sample Input

210 10 1030 10 10

Sample Output

100310

HINT

简单模拟吧
package test20170415;

import java.util.Scanner;

public class Main5 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int x,y,z;
while((n--)>0){
x = input.nextInt();
y = input.nextInt();
z = input.nextInt();
System.out.println(x*y+x/30*z);
}
input.close();
}
}


Problem F: 倒水(Water)

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 292  Solved: 64

SubmitWeb
Board


Description

一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1。此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标。 现在CC想知道,最少需要买多少新瓶子才能达到目标呢?


Input

第一行一个整数T,表示有T组数据。 接着T行,每行两个正整数, N,K(1<=N<=10^9,K<=1000)。


Output

一个非负整数,表示最少需要买多少新瓶子。


Sample Input

33 113 21,000,000 5


Sample Output

1315808


HINT

这个题目还是很有意思的,学会了面向对象的思想,做起来确实很顺手,走运了,调试了一会就好了,人品大爆发!

package test20170415;

import java.util.Scanner;

public class Main6 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int x,y;
while((n--)>0){
x = input.nextInt();
y = input.nextInt();
long res = 0;
long num = 1;
while(true){
if(x < y||fun(x,y)){
break;
}
if(x%2 != 0){
res+=num;
x++;
}
x=x/2;
num = num*2;
//System.out.println(x+" "+y+" "+res);
}
System.out.println(res);
}
input.close();
}
public static boolean fun(int num,int y){
int res = 0;
boolean flag = true;
while(true){
if(res > y){
flag = false;
break;
}
if(num == 0){
break;
}
if(num%2 != 0){
res++;
num--;
}
num/=2;
}
return flag;
}
}


Problem H: 等凹函数

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 78  Solved: 13

SubmitWeb
Board

Description

等凹数字定义一种数字称为等凹数字,即从高位到地位,每一位的数字先递减再递增,且该数是一个回文数,即从左读到右与从右读到左是一样的,仅形成一个等凹峰,如543212345,5544334455是合法的等凹数字,543212346,123321不是等凹数字。现在问你[L,R]中有多少等凹数字呢?L,R<=1e18(小于等于2位的无凹峰)

Input

输入一个整数n,下面是n行数据,每一行数有两个整数分别表示L和R

Output

输出每对数据之间有多少个等凹数字,第个数占一行。

Sample Input

3200 3002000 300020000 30000

Sample Output

225

HINT

很遗憾的一道题,我只会模拟啊,哈哈哈,最后的结果就是超时,超时,超时。。。。
但是思路是正确的,不会什么DFS,什么DP的,真不知道怎么写
超时代码,将就看看吧
package test20170415;

import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main8 {
public static void main(String[] args) {
Scanner input = new Scanner(new BufferedInputStream(System.in));
int n = input.nextInt();
while((n--)>0){
long l = input.nextLong();
long r = input.nextLong();
int res = 0;
for (long i = l; i < r; i++) {
String str = String.valueOf(i);
if(str.length() <= 2){
continue;
}
if(isHuiwen(str)&&isYiYang(str)&&isOk(str)){
res++;
}
}
System.out.println(res);
}
input.close();
}
public static boolean isHuiwen(String str){
boolean flag=true;
int len = str.length();
for (int i = len/2; i >= 0; i--) {
if(str.charAt(i) != str.charAt(len-i-1)){
flag = false;
break;
}
}
return flag;
}
public static boolean isYiYang(String str){
boolean flag=false;
int len = str.length();
for (int i = 1; i < len; i++) {
if(str.charAt(0)!=str.charAt(i)){
flag=true;
}
}
return flag;
}
public static boolean isOk(String str){
int len = str.length();
boolean flag = true;
String s1 = str.substring(0,len/2);
for(int j=0;j<s1.length()-1;j++){
if(s1.charAt(j+1) > s1.charAt(j)){
flag = false;
}
}
if(len%2!=0){
if(str.charAt(len/2)>str.charAt(len/2-1)){
flag = false;
}
}
return flag;
}
}


Problem I: tmk买礼物

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 299  Solved: 93

SubmitWeb
Board

Description

明天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下。

  TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店第2147483647位顾客,本店在搞一个活动,对本店第2147483647位顾客进行赠送活动。你先看看你有多少钱?”

  TMK一摸口袋,发现只有n个硬币,每个硬币的价值为a[i]。

  然后店主继续说:“现在你用你的钱凑一些数,如果你的钱能凑成[0,x]里面所有的数,那么你将会免费获得该店价值x元的代金券,假设你有四个硬币面值分别为1,2,4,100,你就可以凑成[0,7]里面所有的数,我们将会送你7元的代金券。现在就用你的硬币来试试吧。Enjoy yourself!”

  在TMK努力凑钱的时候,店主想知道他要送多少代金券给TMK。

Input

第一行一个整数T,表示数据组数。

对于每组数据,首先读入一个整数n(n<=100000),然后接下来的一行有n个整数,表示a[i] (0<a[i]<=1e9)

Output

对于每个数据,输出一个整数x,表示店主要送x元的代金券给TMK

Sample Input

131 2 3

Sample Output

6

HINT

看到这个题目,我的第一个想法肯定是模拟,哈哈,结果肯定是超时啊,但是我是不死心,果断写了,事实很残酷。。。。
package test20170415;

import java.io.BufferedInputStream;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

public class Main9 {
public static void main(String[] args) {
Scanner input = new Scanner(new BufferedInputStream(System.in));
int n = input.nextInt();
List<Integer> list = null;
while((n--)>0){
list = new LinkedList<Integer>();
int m = input.nextInt();
Set<Integer> set = null;
while((m--)>0){
int x = input.nextInt();
set = new HashSet<Integer>();
int length = list.size();
if(length > 0){
for (int i = 0; i < length; i++) {
set.add(list.get(i)+x);
}
}
set.add(x);
list.addAll(set);
}
Integer i =1;
for(;i<=1000000000;i++){
if(!list.contains(i)){
break;
}
}
System.out.println(i-1);
}
input.close();
}
}


但是思路还是有的,排个序,是不是会有机会AC?我试了试,过了,高兴,哈哈哈
package test20170415;

import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;

public class Main902 {
public static void main(String[] args) {
Scanner input = new Scanner(new BufferedInputStream(System.in));
int n = input.nextInt();
long[] a = null;
while((n--)>0){
long sum =0;
int m = input.nextInt();
a = new long[m];
for (int i = 0; i < m; i++) {
a[i] = input.nextLong();
}
Arrays.sort(a);
if(a[0]!=1){
sum = 0;
}else{
sum = 1;
for (int i = 1; i < a.length; i++) {
if(a[i]>sum+1){
break;
}
sum+=a[i];
}
}
System.out.println(sum);
}
input.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: