当前位置: 代码迷 >> 综合 >> 杭电ACM基础题(1408、1412、1418、1420、1465、1491、1555)
  详细解决方案

杭电ACM基础题(1408、1412、1418、1420、1465、1491、1555)

热度:88   发布时间:2023-12-29 06:16:01.0

文章目录

    • 1408、滴完一瓶盐水所需要的时间
    • 1412、{A} + {B}
    • 1418、欧拉公式
    • 1420、求A^B mod C的结果
    • 1465、装错信封事件
    • 1491、Octorber 21st[计算今天距离10月21日有多少天]
    • 1555、How many days?[手机每天消费1元,每消费K元就可以获赠1元,一开始手机有M元,问最多可以用多少天]

1408、滴完一瓶盐水所需要的时间

WA了

// 滴完一瓶盐水所需要的时间
#include<iostream>
using namespace std;
int main(){
    double vul,d;//(0,5000),该瓶盐水共vul毫升,每一滴d毫升,要用double类型 while(cin>>vul>>d){
    double sum=0;int time=0;for(double i=1; ;i++){
    //i为滴数 sum=sum+d*i;//滴的总毫升数 if(sum<vul){
    time=time+i; //滴的时间 time++;//停顿的时间 }else if(sum ==vul){
    time=time+i;break;}else{
    double a=sum-d*i;int t=1; for(int j=1;;j++){
    if(d*j<vul-a){
    t++;}else{
    break;}}time=time+t;break;}}cout<<time<<endl;} 
} 

1412、{A} + {B}

给你两个集合,要求{A} + {B}.
注:同一个集合中不会有两个相同的元素.
Input
每组输入数据分为三行,第一行有两个数字n,m(0<n,m<=10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元素之间有一个空格隔开.
Output
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开.
Sample Input

1 2
1
2 3
1 2
1
1 2

Sample Output

1 2 3
1 2

Code:
合并A B集合,将合并后的A B按从小到大顺序输出
方法一

//合并A和B集合
#include<iostream>
#include<algorithm>
using namespace std;
int num[20000];
int main(){
    int n,m;//集合A和集合B的个数(0,10000]while(cin>>n>>m){
    for(int i=0;i<n+m;i++){
    cin>>num[i];}sort(num,num+n+m);for(int i=0;i<n+m;i++){
    if(i==0){
    cout<<num[i];}else{
    if(num[i]==num[i-1]){
    //不输出重复的值 continue;}else{
    cout<<" "<<num[i];} }}cout<<endl;} 
} 

方法二、利用set特性

/* 利用set的不允许存在两个相同元素的特性 */
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
int main(){
    int n,m,t;set<int> a;while(cin>>n>>m){
    for(int i=0;i<n+m;i++){
    cin>>t;a.insert(t);}set<int>::iterator it;for(it=a.begin();it!=a.end();it++){
    if(it==a.begin())cout<<*it;elsecout<<" "<<*it;}cout<<endl;a.clear();}return 0;
} 

1418、欧拉公式

如果平面上有n个点,并且每个点至少有2条曲线段和它相连,就是说,每条曲线都是封闭的,同时,我们规定:
1)所有的曲线段都不相交;
2)但是任意两点之间可以有多条曲线段。

如果我们知道这些线段把平面分割成了m份,你能知道一共有多少条曲线段吗?
Input
输入数据包含n和m,n=0,m=0表示输入的结束,不做处理。
所有输入数据都在32位整数范围内。
Output
输出对应的线段数目。
Sample Input

3 2
0 0

Sample Output

3

Code:
欧拉公式的应用

//欧拉公式 任意节点数(n),m(边数) 连通平面图的面数r=m-n+2
#include<iostream>
using namespace std;
int main(){
    long long n,m;//注意整数范围 while(cin>>n>>m){
    if(n==0&&m==0) return 0;cout<<m+n-2<<endl;}
}

1420、求A^B mod C的结果

给定三个正整数A,B和C(A,B,C<=1000000),求A^B mod C的结果.
Input
输入数据首先包含一个正整数N,表示测试实例的个数,然后是N行数据,每行包括三个正整数A,B,C。
Output
对每个测试实例请输出计算后的结果,每个实例的输出占一行。
Sample Input

3
2 3 4
3 3 5
4 4 6

Sample Output

0
2
4

Code

//给定三个正整数A,B和C(0<A,B,C<=1000000),求A^B mod C的结果. 
#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int N;cin>>N;while(N--){
    long long A,B,C;cin>>A>>B>>C;int t=1;for(int i=0;i<B;i++){
    //A^B%C的值 t=t*A%C;}cout<<t<<endl;}
}

1465、装错信封事件

事情是这样的——HDU有个网名叫做8006的男性同学,结交网友无数,最近该同学玩起了浪漫,同时给n个网友每人写了一封信,这都没什么,要命的是,他竟然把所有的信都装错了信封!注意了,是全部装错哟!

现在的问题是:请大家帮可怜的8006同学计算一下,一共有多少种可能的错误方式呢?
Input
输入数据包含多个多个测试实例,每个测试实例占用一行,每行包含一个正整数n(1<n<=20),n表示8006的网友的人数。
Output
对于每行输入请输出可能的错误方式的数量,每个实例的输出占用一行。
Sample Input

2
3

Sample Output

1
2
//错排公式 
#include<iostream>
using namespace std;
int main(){
    int n;//[1,20]long long a[21]={
    0};a[1]=0;a[2]=1;for(int i=3;i<21;i++){
    a[i]=a[i-1]*(i-1)+a[i-2]*(i-1);} while(cin>>n){
    cout<<a[n]<<endl;}
} 

1491、Octorber 21st[计算今天距离10月21日有多少天]

HDU’s 50th birthday, on Octorber 21st, is coming. What an exciting day!! As a student of HDU, I always want to know how many days are there between today and Octorber 21st.So, write a problem and tell me the answer.Of course, the date I give you is always in 2006.
Input
The input consists of T test cases. The number of T is given on the first line of the input file.Following T lines, which represent dates, one date per line. The format for a date is “month day” where month is a number between 1 (which indicates January) and 12 (which indicates December), day is a number between 1 and 31.All the date in the input are in 2006, you can assume that all the dates in the input are legal(合法).
Output
For each case, if the date is before Octorber 21st, you should print a number that between the date and Octorber 21st.If the day is beyond Octorber 21st, just print “What a pity, it has passed!”.If the date is just Octorber 21st, print"It’s today!!".
Sample Input

7
10 20
10 19
10  1
10 21
9   1
11 11
12 12

Sample Output

1
2
20
It's today!!
50
What a pity, it has passed!
What a pity, it has passed!

Code
计算今天距离10月21日有多少天

//计算今天距离10月21日有多少天
#include<iostream>
using namespace std;
int main(){
    int t;//t个测试用例 cin>>t;int month,day,sum_day;;for(int i=0;i<t;i++){
    cin>>month>>day;if(month==10&&day==21){
    cout<<"It's today!!"<<endl;}else if(month==10&&day>21){
    cout<<"What a pity, it has passed!"<<endl;}else if(month>10){
    cout<<"What a pity, it has passed!"<<endl;}else{
    switch(month){
    case 1:sum_day=31-day+28+31*4+3*30+21;break;case 2:sum_day=28-day+31*4+30*3+21;break;case 3:sum_day=31-day+31*3+3*30+21;break;case 4:sum_day=30-day+31*3+30*2+21;break;case 5:sum_day=31-day+31*2+30*2+21;break;case 6:sum_day=30-day+31*2+30+21;break;case 7:sum_day=31-day+31+30+21;break;case 8:sum_day=31-day+30+21;break;case 9:sum_day=30-day+21;break;case 10:sum_day=21-day;break;}cout<<sum_day<<endl;}} 
} 

1555、How many days?[手机每天消费1元,每消费K元就可以获赠1元,一开始手机有M元,问最多可以用多少天]

8600的手机每天消费1元,每消费K元就可以获赠1元,一开始8600有M元,问最多可以用多少天?
Input
输入包括多个测试实例.每个测试实例包括2个整数M, k,(2 <= k <= M <= 1000).M = 0, k = 0代表输入结束.
Output
对于每个测试实例输出一个整数,表示M元可以用的天数。
Sample Input

2 2
4 3
0 0

Sample Output

3
5

Code:

//手机每天消费1元,每消费K元就可以获赠1元,一开始手机有M元,问最多可以用多少天?
#include<iostream>
using namespace std;
int main(){
    int M,k;//共M元,每消费k元可以获赠1元while(cin>>M>>k){
    if(M==0&&k==0) return 0;int days=0,M1=0;while(M>0){
    //消费k元 if(M>=k){
    days=days+k;// 每天消费1元,消费k元即用了k天 M=M-k+1;//每消费k元获赠一元 }else{
    days=days+M;M=0;} }cout<<days<<endl;} 
}
  相关解决方案