每日一题4.26-4.30

每日一题4.26-4.30

4.26

problem:Protecting the Flowers

题目大意:

                         一共N头牛在吃花,第i头牛每分钟吃di朵花,送其回牛舍需要时间ti,期间其他牛正常吃花。求以怎样的顺序下把牛送回使得花被吃的数量最少,并输出被吃花的数目。

思路:

                        一道贪心题。我们每次需用最短的时间将吃花速度最快的牛送花牛宿即可。但是某一头牛的俩个属性往往不全是最优解。所以,我们将ti/di比值最小的先行送回。

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
struct flower
{
	ll t,d;
}f;
bool operator <(const flower& f1,const flower& f2)
{
	double x1,x2;x1=1.0*f1.t/f1.d;x2=1.0*f2.t/f2.d;
	return x1>x2;
}
int main()
{
	int n;
	cin>>n;
	ll d,t,max=0;
	priority_queue <flower> que;
	for(int i=0;i<n;i++) cin>>t>>d,f.d=d,f.t=t,que.push(f),max+=d;	
	ll ans=0;
	for(int i=0;i<n;i++)
	{
		f=que.top();
		t=f.t;
		d=f.d;
		max-=d;
		ans+=max*t*2;
		que.pop();
	}
	cout<<ans<<endl;
return 0;}

4.27:

problem:NC23053 月月查华华的手机

题目大意:

                      输入一个字符串A与整数N。接着有N个字符串Bi,判断该字符串是否为A的子串。是就输出“Yes”否则输出“No”。

思路:

                      (不断更新查找的起始位置)我们将Bi字符串分解为一个个字符,在A中查找是否存在该字符,不存在直接跳出循环输出“No”。如果该字符存在则查找下一个字符,且下一个字符从该字符查找成功的位序的后一位开始查找。不需要从头开始在比较位序。这样算时间复杂的应为O(n)。

#include <iostream>
#include <string>
using namespace std;
int main()
{
	int n,l,la,flag;
	string a,x;
	cin>>a;
	la=a.size();
	cin>>n;
	while(n--)
	{
		cin>>x;
		l=x.size();
		for(int i=0,j=0;i<l;i++)
		{
			flag=0;
			for(;j<la;j++)
			{
				if(x[i]==a[j]) 
				{flag=1;j++;break;}
			}
			if(flag==0) break;
		}
		if(flag) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;	
	}
return 0;}

小结:

            题目比较简单,更新起始查找位置是该问题的关键。以前字符串类型题目写的少,这次倒是学到了string的一些用法。例如substr(int,int)用于截取字符串中的某一段。string类型的长度直接用.size()成员函数得出即可。以前总以为string类似与int是一种数据类型,现在看来string更像是vector一类的stl,有很多成员函数可以使用。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值