19级爪哇程序设计新手赛(题解)

19级爪哇程序设计新手赛(题解)

A.1+1 HDU - 1228
kk的英语作业,有两个小于100的正整数A和B,计算A+B.
A和B由对应的英文单词给出.
Input
测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出.
Output
对每个测试用例输出1行,即A+B的值.

这道题主要就是考大家对字符串的转化,英语到数字。
可能坑点就在于字符串 “123” 怎么转化为数字 一百二十三

#include <bits/stdc++.h>//打比赛万能头是个好东西
//目前只有poj不支持这个头文件好像,推荐使用
#define MAX_INT  ((unsigned)(-1)>>1)
using namespace std;
typedef unsigned long long ll;
char a[10][6] = {"zero","one","two","three","four","five","six","seven","eight","nine"};
//这里将英文存储起来
int change(string s)//寻找这个数字是什么
{
    for(int i=0;i<10;i++){
        if(a[i]==s) return i;
    }
}
int main(void)
{
    string s;
    while(1){
        int a=0,b=0;
        while(cin>>s){
            if(s=="+") break;
            a=a*10+change(s);//字符串 “123” 怎么转化为数字 一百二十三
        }
        while(cin>>s){
            if(s=="=") break;
            b=b*10+change(s);
        }
        if(a==0&&b==0) break;
        else cout<<a+b<<endl;
    }
    return 0;
}

B - 1 + 1 ! HDU - 1237
小明一天在家闲的无聊,突然想做个计算器程序。于是小明叫上好朋友小刚一起来完成这个问题。输入一行表达式,只包括’+’, ‘-’, ‘*’, ‘/’。
Input
多组输入,每个样例占一行,每行字符不超过两百,遇零结束
Output
对于每个样例,在一行输出表达式的值,保留小数点后两位。

这道题的确比较难。要利用好每个字符之间的空格。
注意点是,可以把正负号放在这个符合后面那个数。用数组储存,然后最后再累加一次。

#include <bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
using namespace std;
typedef unsigned long long ll;
int main(void)
{
    double a[200],s,c;
    char b,d;
    while(scanf("%lf",&s)){
        char kk;
        kk=getchar();
        if(kk=='\n'){
            if(!s) break;
            else{
                printf("%.2lf\n",s);
                continue;
            }
        }
        a[0]=s;
        int i=0;
        while(scanf("%c %lf%c",&b,&c,&d)){
            if(b=='+') a[++i]=c;
            else if(b=='-') a[++i]=-1*c;
            else if(b=='*') a[i]*=c;
            else if(b=='/') a[i]/=c;
            if(d!=' ') break;
        }
        double ans=0;
        for(int j=0;j<=i;j++){
            ans+=a[j];
        }
        printf("%.2lf\n",ans);
    }
    return 0;
}

C - 1 + 1 ? HDU - 2524
给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形,下图为高为2,宽为4的网格.
在这里插入图片描述
Input
第一行输入一个t, 表示有t组数据,然后每行输入n,m,分别表示网格的高和宽 ( n < 100 , m < 100).
Output
每行输出网格中有多少个矩形.

不要给题目吓到了,弄成英语是为了更接近比赛,也只有这一道是英语的而已。

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
      int n,a,b;
      cin>>n;
      while(n--){
            cin>>a>>b;
            long long a1=a*(a+1)/2;
            long long a2=b*(b+1)/2;
            cout<<a1*a2<<endl;
      }
      return 0;
}

D - 公倍数问题 HDU - 1108
给定两个正整数,计算这两个数的最小公倍数。
Input
输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.
Output
对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行。

妥妥的签到题啊!!!
__gcd() :这个是内置的求最大公因数的函数!

#include <bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
using namespace std;
typedef unsigned long long ll;
int main(void)
{
    int a,b;
    while(cin>>a>>b){
        cout<<a*b/__gcd(a,b)<<endl;
    }
    return 0;
}

E - 加多少? POJ - 1207
对于一个数字n,如果它是偶数则n=n/2,否则n=n*3+1。
对于一个区间[l,r]如果 l>r则为[r,l]中的数字,如果将其不停应用如上操作,直到其等于1为止。
问所需操作数最多的一个数字是多少?

Input
数据多测
每行输入一对数字l r
范围0< l, r < 10000

Output
对于每个区间,首先输出区间,然后输出区间中操作数最多的数字所需的操作数。

#include <iostream>
#include <algorithm>
#include <iomanip>
#include"stdio.h"
#include <cstring>
#include<math.h>
using namespace std;
int is(int l,int r)
{
      int max1=0;
      for(int k=l;k<=r;k++){
            int num=0;
            int i=k;
            while(i!=1){
                  if(i%2==0){
                        i/=2;
                        num++;
                  }
                  else{
                        i=i*3+1;
                        num++;
                  }
            }
            max1=max(num,max1);
      }
      return max1;
}
int main(void)
{
      int a,b;
      while(cin>>a>>b){
            int max1=0;
            max1=is(min(a,b),max(a,b));
            cout<<a<<" "<<b<<" "<<max1+1<<endl;
      }
      return 0;
}

F - 你有钱吗? HDU - 1284
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
Input
每行只有一个正整数N,N小于32768。
Output
对应每个输入,输出兑换方法数。

#include <bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
using namespace std;
typedef unsigned long long ll;
ll a[40000];
int main(void)
{
    a[0]=1;
    for(int i=1;i<=3;i++){
        for(int j=i;j<32768;j++){
            a[j]+=a[j-i];
        }
    }
    int b;
    while(cin>>b){
        cout<<a[b]<<endl;
    }
    return 0;
}

G - 质数还是素数? HDU - 1262
哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.
做好了这件实事,就能说明这个猜想是成立的.
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.
Input
输入中是一些偶整数M(5<M<=10000).
Output
对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数.

暴力判断是不是素数就可以了

#include<bits/stdc++.h>
using namespace std;
bool is(int k)
{
      for(int i=2;i<=sqrt(k);i++){
            if(k%i==0) return false;
      }
      return true;
}
int main(void)
{
      int n,a,b;
      while(cin>>n){
            a=n/2;//拆成两半
            b=n/2;
            do{
                  if(is(a)&&is(b)){
                        cout<<b<<" "<<a<<endl;
                        break;
                  }
                  a++;b--;//对每一半进行判断
            }while(1);
      }
      return 0;
}

H - A pile of stones CodeForces - 1159A

小明一开始有一堆石子,给一个长度为n(1<=n<=100)的操作序列,"-“表示取出一个石子,”+"表示放入一个石子,求最后小明最后至少有几个石子.

Examples:
Input
3
 ---
Output
0
Input
4
++++
Output
4
Input
2
-+
Output
1
Input
5
++-++
Output
3
#include"iostream"
using namespace std;
int main(void)
{
    int n,a=0;
    while(cin>>n){
        char aa[100];
    	for(int i=0;i<n;i++){
            cin>>aa[i];
        if(aa[i]=='+')
            a++;//加石头
        else {
            a--;//减石头
            if(a<0)//如果小于0就归为0
                a=0;
        }
    }
    cout<<a<<endl;
    }
	return 0;
}

I - 还是素数 HDU - 1431
给了你几组a和b,希望你能找到a和b之间所有的回文质数(5 <= a < b <= 100000000)
Input
这里有许多组数据,每组包括两组数据a跟b。
Output
对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。

一直去判断是不是回文和素数会超时,你看看,1e8,一亿次运算!!
所以不能从 l 跑到 r ,相反,把素数或者回文数给存起来,每次判断这些数就可以!

#include <bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
using namespace std;
typedef unsigned long long ll;
bool is(int k)
{
      for(int i=2;i<=sqrt(k);i++){
            if(k%i==0) return false;
      }
      return true;
}
int a[100000]={5,7,11};
int m=3;
void kkk(){
    int i,j,k,l;
    for(i=1;i<10;i++)
    for(j=0;j<10;j++){
        a[m++]=i*100+j*10+i;
    }
    for(i=1;i<10;i++)
    	for(j=0;j<10;j++)
    		for(k=0;k<10;k++){
        a[m++]=i*10000+j*1000+k*100+j*10+i;
    }
    for(i=1;i<10;i++)
    	for(j=0;j<10;j++)
    		for(k=0;k<10;k++)
    			for(l=0;l<10;l++){
        a[m++]=i*1000000+j*100000+k*10000+l*1000+k*100+j*10+i;
    }
    for(i=1;i<10;i++)
    	for(j=0;j<10;j++)
    		for(k=0;k<10;k++)
    			for(l=0;l<10;l++){
        a[m++]=i*10000000+j*1000000+k*100000+l*10000+l*1000+k*100+j*10+i;
    }
}
int main(void)
{
    kkk();
    int l,r;
    while(cin>>l>>r){
        for(int i=0;i<=m;i++){
            if(a[i]>=l&&a[i]<=r&&is(a[i]))
                cout<<a[i]<<endl;
        }
        cout<<endl;
    }
    return 0;
}

J - 不容易系列之一 HDU - 1465
WBH垃圾丢错啦,他想知道有多少种丢错垃圾的可能,总共有n袋垃圾和n个垃圾桶,假设wbh全丢错了呢,那么他有多少种丢错的可能,请输出一个值代表wbh有多少种可能全丢错
Input
输入数据包含多个多个测试实例,每个测试实例占用一行,每行包含一个正整数n(1<n<=20),n表示垃圾桶和垃圾袋的量。
Output
对于每行输入请输出可能的错误方式的数量,每个实例的输出占用一行。

#include <bits/stdc++.h> 
using namespace std;	
int main(){
    int i,n;
    long long a[21],s;
    a[1]=0;
    a[2]=1;
    a[3]=2;
    for(i=4;i<=20;i++)
        a[i]=(i-1)*(a[i-1]+a[i-2]);
    while(~scanf("%d",&n)){
    	printf("%lld\n",a[n]);
	}
    return 0;
}

K - 嘿嘿嘿!排序题 HDU - 1031
X市要参加优秀城市评比了!为了了解市民对X市各方面的满意度,阿Q针对市民专门做了一个问卷调查。问卷列出了关于城市的M个方面,随机寻找N个人来对城市打分。为了更好的宣传X市,阿Q决定从中选出K个方面来对城市进行宣传,请你找出市民满意度最高的K个方面。
Input
多组输入。
第一行:N M K
第2~N+1行:每行M个数,表示每个人对第i个方面的满意度
Output
对于每组输入,输出得分最高的K个方面(按照非递增顺序排列)
没有多余的空格或换行

先将num的值进行排序,再对id值进行排序。
推荐了解并熟悉 sort()内置函数机制~

#include <bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
using namespace std;
typedef unsigned long long ll;
struct node
{
    int id;
    double num;
}a[100005];
bool cmp1(node x,node y)
{
    return x.num>y.num;
}
bool cmp2(node x,node y)
{
    return x.id>y.id;
}
int main(void)
{
    int n,m,k;
    while(cin>>n>>m>>k){
        for(int i=1;i<=m;i++) a[i].id=i,a[i].num=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                double p;cin>>p;
                a[j].num+=p;
            }
        }
        sort(a+1,a+1+m,cmp1);
        sort(a+1,a+1+k,cmp2);
        for(int i=1;i<k;i++){
            cout<<a[i].id<<" ";
        }
        cout<<a[k].id<<endl;
    }
    return 0;
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值