每日一题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,有很多成员函数可以使用。