POJ1003/1004/1005/1207/3299/2159/1083/3094/2388解题(刷一波水题)

POJ 1003

这里写图片描述
题目链接
http://poj.org/problem?id=1003
大意:长度=1/2+1/3+…+1/n,给定长度值,求n

#include<iostream>
using namespace std;
int main()
{
    float len = 0,sum;
    int n;
    while(cin >> len && len != 0)
    {
        for(n=2,sum=0;sum<len;++n)
        {
            sum += 1/(n*1.0);
        }
        cout << n-2 << " " << "card(s)" << endl;
    }
    return 0;
}

POJ 1004

这里写图片描述
题目链接
http://poj.org/problem?id=1004
大意:求平均数

#include<iostream>
using namespace std;
int main()
{
    float money,avgmoney=0;
    int i = 0;
    while(cin >> money && i != 12)
    {
        avgmoney += money;
        ++i;
   }
   cout << "$" << avgmoney/12 << endl;
}

POJ 1005

这里写图片描述
题目链接
http://poj.org/problem?id=1005
大意:求一个点什么时候被慢慢变大的半圆吃掉

#include<iostream>
using namespace std;
#define PI 3.141592654
int main()
{
    double X,Y;
    double area,distance,dangerdistance;
    int year;
    int N;
    cin >> N;
    for(int i = 1; i <= N; ++i)
    {
        cin >> X >> Y;
        distance = X*X+Y*Y;
        dangerdistance=0;  //之前没有写这句,没有初始化,踩过好几次地雷了!!!!!!!!
        for(area = 0,year =0; dangerdistance <= distance; ++year)
        {
            area += 50;
            dangerdistance = 2*area/PI;
        }
        cout << "Property " << i << ": This property will begin eroding in year " 
		        << year << "." << endl;
    }
    cout << "END OF OUTPUT.";
    return 0;
}

POJ 1207

这里写图片描述
题目链接
http://poj.org/problem?id=1207
大意:有一个数,按那个规则,最后能够转换到1,算出这个序列的长度,然后输入两个数,在这两个数构成的闭区间中,每个数都有其序列长度,求这个序列中最长的一个。

#include<iostream>
using namespace std;
int main()
{
	int a,b;
	while(cin >> a >> b)
	{
		cout << a << " " << b << " " ;//坑,要先输出a,b,如果调换了,输出就颠倒了
		if(a > b)
			swap(a,b);
		int maxcyclen=0;
		int cyctime=0;
		int num=0;
		for(int i = a,j=0; i <= b; ++i,++j)
		{
			num = i;
			cyctime=1;
			while(num != 1)
			{
				if(num%2==1)
				{
					num = 3*num+1;
				}
				else
				{
					num /= 2;
				}
				++cyctime;
			}
			if(maxcyclen < cyctime)
			{
				maxcyclen = cyctime;
			}
		}
		cout << maxcyclen << endl;
	}
	return 0;
}

POJ 3299

这里写图片描述
题目链接
http://poj.org/problem?id=3299
大意:公式推导,给任意两个,求第三个。(注意输入顺序)

#include<iostream>
using namespace std;
#include<iomanip>
#include<math.h>

int main()
{
	cout << setiosflags(ios::fixed) << setprecision(1);//需要头文件#include <iomanip>,小数点精度1位
	double t,d,h,num1,num2;
	char alpha,beta;
	while(cin >> alpha && alpha != 'E')
	{
		cin >> num1 >> beta >> num2;
		if(alpha=='T'&&beta=='D' || alpha=='D'&&beta=='T')
		{
			t = num1;
			d = num2;
				if(alpha=='D')//输入顺序变了,名称与内容不符,换回来
				swap(t,d);
			h=t+0.5555*(6.11*exp(5417.7530*((1/273.16)-(1/(d+273.16))))-10);
		}
		else if(alpha=='T'&&beta=='H' || alpha=='H'&&beta=='T')
		{
			t = num1;
			h = num2;
			if(alpha=='H') //输入顺序变了,名称与内容不符,换回来
				swap(t,h);
			d=1/(1/273.16-log(((h-t)/0.5555+10.0)/6.11)/5417.7530)-273.16;;
		}
		else if(alpha=='D'&&beta=='H' || alpha=='H'&&beta=='D')
		{
			d = num1;
			h = num2;
			if(alpha=='H') //输入顺序变了,名称与内容不符,换回来
				swap(d,h);
			t=h-0.5555*(6.11*exp(5417.7530*((1/273.16)-(1/(d+273.16))))-10.0);
		}	
		cout << "T " << t << " D " << d << " H " << h << endl; 
	}
	return 0;
}

POJ 2159

这里写图片描述

题目链接
http://poj.org/problem?id=2159
大意:
1.一串字符串(大写字母),每个字母可以按照一个数平移成另一个字母
2.每一个字符加密后,再乱序
3.给定A,B两个字符串,求A是否可能是B的密文

之前题目理解错了,以为每个字母都是平移1位(按照示例的理解)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int secretnum = 1;	//移动的位数(每个都一样)
    char word1,word2;
    vector<char> secrettext,origintext;
    while(cin.get(word1))
    {
        if(word1 == '\n')
            break;
        if(word1 >= 'A' && word1 <= 'Z')
        {
            word1 = word1 - secretnum;
            if(word1 < 'A')
                word1 = word1 + 26;
            secrettext.push_back(word1);
        }
        else
        {
            continue;
        }
    }
    while(cin.get(word2))
    {
        if(word2 == '\n')
            break;
        if(word2 >= 'A' && word2 <= 'Z')
        {
            origintext.push_back(word2);
        }
        else
        {
            continue;
        }
    }
    sort(secrettext.begin(),secrettext.end());//字母升序排序
    sort(origintext.begin(),origintext.end());//字母升序排序
    for(int i = 0;i != secrettext.size();++i)
    {
        if(secrettext[i] != origintext[i])
        {
            cout << "NO" ;
            return 0;
        }
    }
    cout << "YES" ;//都升序排列后,每一位都相等则ok(题目没说都移动同样位数,解答错误)
    return 0;
}

正确的解答

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    char word1, word2;
    int secrettext[26]={0}, origintext[26]={0};
    while(cin.get(word1))
    {
        if(word1 == '\n')
            break;
        if(word1 >= 'A' && word1 <= 'Z')
        {
            ++secrettext[word1-'A'];    //统计每个字符的频次存入数组
        }
        else
        {
            continue;
        }
    }
    while(cin.get(word2))
    {
        if(word2 == '\n')
            break;
        if(word2 >= 'A' && word2 <= 'Z')
        {
            ++origintext[word2-'A'];    //统计每个字符的频次存入数组
        }
        else
        {
            continue;
        }
    }
    sort(secrettext,secrettext+26); // 对频次进行排序
    sort(origintext,origintext+26); // 对频次进行排序
    for(int i = 0;i != 26;++i)
    {
        if(secrettext[i] != origintext[i])
        {
            cout << "NO" ;
            return 0;
        }
    }
    cout << "YES" ; //频次完全一致,则每个字符经过一定平移即可得到第二行的字符串
    return 0;
}

POJ 1083

这里写图片描述
题目链接
http://poj.org/problem?id=1083
这里写图片描述
大意:
1.400个房间,从一个房间移动1张桌子到另一个房间,需要10分钟。
2.过道只能有一张桌子,包含门前的位置,被占用的时候,其它需要经过的移动需要等待,不能同时进行。
解法:
1.申请200大小的数组代表门前的过道,从房间m到房间n,(m < n),则 ( m - 1 ) /2 到(n - 1)/ 2 的元素都加10;
2.扫描数组,最大的元素即为搬运的时间。

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int testtime, table, roomid1, roomid2;
	int corridor[200]={0}, corridor_id, maxtime;
	cin >> testtime;
	while(testtime--)
	{
		memset(corridor,0,sizeof(corridor)); 
		//清零初始化(不能写corridor[200]={0};只能定义的时候写一次),memset需要cstring头文件
		//经测试,单独写的corridor[200]={0};对数组没有任何操作,编译器可能不报错,需要避开这个坑!!!
		cin >> table;
		while(table--)
		{
			cin >> roomid1 >> roomid2;
			if(roomid1 > roomid2)
				swap(roomid1,roomid2);
			for(corridor_id = (roomid1-1)/2; corridor_id <= (roomid2-1)/2; ++corridor_id)
			{
				corridor[corridor_id] += 10;
			}
		}
		maxtime = 0;
		for(corridor_id = 0; corridor_id != 200; ++corridor_id)
		{
			if(maxtime < corridor[corridor_id])
				maxtime = corridor[corridor_id];
		}
		cout << maxtime << endl;
	}
}

POJ 3094

这里写图片描述
题目链接
http://poj.org/problem?id=3094
大意:
每一行字符串包括空格,经过对每个字符乘以系数,然后加总求和。
例如: ACM:1 * 1 + 2 * 3 + 3 * 13 = 46 (A=1,B=2,…空格=0)
MID CENTRAL:1 * 13 + 2 * 9 + 3 * 4 + 4 * 0 (空格占位置)+ 5 * 3 + 6 * 5 + 7 * 14 + 8 * 20 + 9 * 18 + 10 * 1 + 11 * 12 = 650

#include<iostream>
using namespace std;
int main()
{
    char alpha;
    int quicksum = 0;
    while(cin.get(alpha) )
    {
        if(alpha == '#')
            break;
        quicksum = 0;
        for(int i = 1; alpha != '\n';++i)
        {
            if(alpha != ' ')
                quicksum = quicksum + i*(alpha-'A'+1);
            cin.get(alpha);  //cin.get()可以捕捉空格, cin >> char 不可以捕捉空格回车
        }
        cout << quicksum << endl;
    }
}

POJ 2388

这里写图片描述
题目链接
http://poj.org/problem?id=2388
大意:求中位数,简单。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int num;
	cin >> num;
	int *milk = new int[num];
	for(int i = 0; i != num; ++i)
	{
		cin >> milk[i];
	}
	sort(milk,milk+num);
	cout << milk[num/2];
	delete [] milk;
	milk = NULL;
	return 0;
}

在这里插入图片描述

/**
 * @description: poj2388 求中位数
 * @author: michael ming
 * @date: 2019/5/31 0:12
 * @modified by: 
 */
#include <algorithm>
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
int main()
{
    int N, num, i = 0;
    cin >> N;
    vector<int> maxheap, minheap;
    while(i++ < N && cin >> num)
    {
        if(maxheap.empty())
        {
            maxheap.push_back(num);
            continue;
        }
        //----选择插入哪个堆-----
        if(!maxheap.empty() && num <= maxheap[0])
        {
            maxheap.push_back(num);
            push_heap(maxheap.begin(),maxheap.end());//默认采用 < , 大堆
        }
        else if(!maxheap.empty() && num > maxheap[0])
        {
            minheap.push_back(num);
            push_heap(minheap.begin(),minheap.end(),greater<int>());//小堆,采用 >
        }
        //----平衡两个堆的节点比列----
        if(maxheap.size() > minheap.size() && maxheap.size() - minheap.size() > 1)
        {
            minheap.push_back(maxheap[0]);//大堆顶进入小堆
            push_heap(minheap.begin(),minheap.end(),greater<int>());
            pop_heap(maxheap.begin(),maxheap.end());//堆顶到末尾了
            maxheap.pop_back();//删除到末尾的"堆顶"
        }
        else if(maxheap.size() < minheap.size())
        {
            maxheap.push_back(minheap[0]);
            push_heap(maxheap.begin(),maxheap.end());//默认采用 < , 大堆
            pop_heap(minheap.begin(),minheap.end(),greater<int>());
            minheap.pop_back();
        }
    }
    if(maxheap.size())
        cout << maxheap[0] << endl;
    return 0;
}
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael阿明

如果可以,请点赞留言支持我哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值