基础训练练习(no.0)

1119 · 数字游戏 · 题目答案:

题目描述:

小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串 来玩数字游戏,小 P 同学想要知道字符串中究竟有多少个 1。
注意:01 字符串为每一个字符是 0 或者 1 的字符串,如“101”(不含双引号)为一个长度为 3 的 01 字符串。
#include<bits/stdc++.h>
using namespace std;
char s[80];
int sum;
int main() {
	cin>>s;
	for(int i=0;i<8;i++)
	{
		if(s[i]=='1')
		sum++;
	}
	cout<<sum<<endl;

	return 0;
}

1120 · 公交换乘 · 题目答案:

题目描述:

著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:
1、在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间与开始乘地铁的时间之差小于等于 45 分钟,即:tbus​−tsubway​≤45
2、搭乘地铁获得的优惠票可以累积,即可以连续搭乘若干次地铁后再连续使用优惠票搭乘公交车,但每次搭乘公交车只能使用一张优惠券。
3、搭乘公交车时,如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。
现在你得到了小轩最近的公共交通出行记录,你能帮他算算他的花费吗?

#include <iostream>
using namespace std;

// 结构体定义
typedef struct ride // 用来记录乘车记录
{
	bool type;
	int price , time;
} rd;

typedef struct discount // 用来记录优惠(免费)票
{
	int getTime = -1 , mon = -1; // 随时清理用过或过期的票,这样就不用used来记录了
} disc;

// 两个数组
rd travel[100005];
disc dis[50];// 只需要45个就够了,因为过期时间是45分钟,题目给出不会有两次车出现在同一分钟,所以最多存储45张优惠票,50是因为设了余量防止溢出

int main()
{
	int n , l = 49 , sum = 0; // l = 49,从后往前存储,这样容易删除过期的票
	cin >> n; // 输入
	for(int i = 0 ; i < n ; i++)
	{
		cin >> travel[i].type >> travel[i].price >> travel[i].time;
		bool flag = false; // 我们可爱的小标记
		//重复清理过期优惠券
		// l要是=49就代表没有优惠券了(别问我大于49是怎样的,自己想想……)
		// 别看是三重循环,速度可比以前快多了
		while(l < 49 && travel[i].time - dis[49].getTime > 45) //当当前优惠券时间过期时就重复执行
		{
			//用for循环将数据向后一项推进,相当于把以前的最后一个覆盖,这也是为什么上面while循环减去的永远是dis[49].getTime
			for(int k = 48 ; k > l ; k--)
			{
				dis[k+1].getTime = dis[k].getTime;
				dis[k+1].mon = dis[k].mon;
			}
			// 并将之前最新的优惠券那里填上-1
			dis[l+1].getTime = -1;
			dis[l++].mon = -1;
		}
		// 当坐地铁时
		if(!travel[i].type)
		{
			// 累加
			sum += travel[i].price;
			// 记录
			dis[l].getTime = travel[i].time;
			dis[l--].mon = travel[i].price;
		}
		// 当坐公交车时
		else
		{
			// j不用再从0到j了,剩下了很多时间
			for(int j = 49 ; j > l ; j--)
			{
				// 简单的小判断,判断钱数超没超
				if(travel[i].price <= dis[j].mon)
				{
					// 没有接使用并标记,再将其前面的优惠券向前推进,从而覆盖这个优惠券,相当于删除
					flag = true;
					for(int k = j-1 ; k > l ; k--)
					{
						dis[k+1].getTime = dis[k].getTime;
						dis[k+1].mon = dis[k].mon;
					}
					dis[l+1].getTime = -1;
					dis[l++].mon = -1;
					// 撒由哪啦┏(^0^)┛
					break;
				}
			}
			// 没标记就累加
			if(!flag)
			{
				sum += travel[i].price;
			}
		}
	}
	// 输出结果……
	cout << sum << endl;
 	return 0;
}

1155 · 三角形面积 · 题目答案:

题目描述:

输入三角形三边长a,b,c(保证能构成三角形),输出三角形面积。
#include<bits/stdc++.h>
using namespace std;

int main(){
    double a , b , c;
    cin >> a >> b >> c;
    double p = (a + b + c) * 1.0 / 2;
    double s = sqrt(p * (p - a) * (p - b) * (p - c));
    cout << fixed << setprecision(4) << s;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值