直接模拟场景的算法

项目场景:

在开始时,给水管和排水管都是打开状态的,并且游泳池里没有水。在自动装置的作用下,每经过t1分钟,给水管的状态都会改变,即从打开状态变为关闭状态或从关闭状态变为打开状态,而同时每经过t2分钟,排水管的状态也会改变。当给水管打开时,给水管每分钟会向游泳池里注入m1升水;当排水管打开时,排水管每分钟会把游泳池里水排走m2升;当给水管和排水管同时打开时,游泳池的水量变化为每分钟(m1-m2)升。当然泳池的水量不能变为负数,同时泳池也有个最大容量m,水量不能超过m升。那么经过t分钟后,游泳池里有多少升水?

问题描述:

输入第一行为一个正整数T,表示有T组数据。

每组数据的为一行包含六个整数,分别表示m, t, m1, t1, m2, t2。

数据范围:

对于所有数据,满足1<=T<=10, 1<=m<=100000, 1<=t<=86400, 1<=m1,m2<=100, 1<=t1,t2<=10。

对于每一个数据,输出一行,包括一个整数,为在t分钟后游泳池中的水量

原因分析:

1.注意限制:不能为负数,不能超过m
2.数据范围:等下再说
3.思路:能不能以t循环来模拟
那么大概模拟的量是10*86400就是80万次计算。计算量还可以接受。
4.假设按照上述思路:
T循环
t循环
排水
如果<0设为0,如果>m设为m
给水
如果<0设为0,如果>m设为m
如果t%t10
需要改变排水
如果t%t2
0
需要改变给水

结束t

结束T

5.写出程序

需要注意的问题:
数字表示范围
int可表示到2亿
多少的运算量是可以接受的呢?
反正上次的400亿不行

解决方案:

#include <bits/stdc++.h>
 using namespace std;
 
 
 
 int main(){
 	int T;int t;int m1;int m2;int t1;int t2;long int m;int cur_water;
 	bool flag_in=1;int flag_out=1;//开就是1 关就是0
	 cin>>T;
 	for(int i1=1;i1<=T;i1++){
 		cin>>m;cin>>t;cin>>m1;cin>>t1;cin>>m2;cin>>t2; 
		 //每一轮恢复原状
		 flag_in=1;flag_out=1;cur_water=0;
		 for (int i2=1;i2<=t;i2++){
		 	if (flag_in&&flag_out)
			 cur_water+=m1-m2;
		 	//判断溢出或空
		 	//这里必须要注意 给水和排水不是一个在先一个在后的 所以必须同时进行 
		 	else if (flag_out)
		 		cur_water-=m2;
		 	
		 	else if (flag_in)
		 		cur_water+=m1;
		 	else
		 		;
		 		
			//判断溢出或空
			if(cur_water<0) cur_water=0;
		 	else if(cur_water>m) cur_water=m;
		 	//cout<<"cur"<<cur_water<<'\n';
			 	 	
 			if((i2>=t1)&&(i2%t1==0)){
 				//cout<<"i2%t1==0";
 				flag_in=!flag_in;
			 }
			if((i2>=t2)&&(i2%t2==0)){
				flag_out=!flag_out;
			}
			
 						
		 }//end t
 		
 		cout<<cur_water<<'\n';
 		
	 }//end T
	  
 	
 	
 	
 }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值