1001题:
题目要求是给你n,m,p,q;需要买n个,而单个买p元每个,q元m个,求花最少钱买>=n个
这题很水,细心一点就不会错。。
#include<iostream>
using namespace std;
int main()
{
long long n,m,p,q;
int T;
cin>>T;
while(T--){
cin>>n>>m>>p>>q;
double qq=q,mm=m;
if(qq/mm>=p){
cout<<p*n<<endl;
}
else{
long long costp=n/m;
long long costq=n%m;
if(costp<1){
if(p*n>q)cout<<q<<endl;
else cout<<p*n<<endl;
}
else{
long long cost=costp*q;
if(costq*p>q)cout<<cost+q<<endl;
else cout<<costq*p+cost<<endl;
}
}
}
return 0;
}
1002题;
题意:给你一个字符串ss=“anniversary”,输入一个s,从s中取三段,看看三段串起来是否可以构成ss
方法:把ss分成三段,在s中查找即可
#include<iostream>
#include<stdio.h>
#include<string>
#include<algorithm>
#define INF 999999999
using namespace std;
string s;
int findstr(string s1,string s2,string s3)
{
string ss=s;
int n=ss.find(s1,0);
if(n!=string::npos){
int nn=ss.find(s2,n+s1.size());
if(nn!=string::npos){
if(ss.find(s3,nn+s2.size())!=string::npos){
cout<<"YES"<<endl;
return 1;
}
}
}
return 0;
}
int main()
{
int T;
string s0="anniversary";
cin>>T;
while(T--){
cin>>s;
int n0=s0.size();
int flag=0;
for(int i=1;i<s0.size()-2;i++){
string s1=s0.substr(0,i);
for(int j=1;j<s0.size()-i;j++){
string s2=s0.substr(i,j);
string s3=s0.substr(i+j,n0-i-j);
flag=findstr(s1,s2,s3);
if(flag)break;
//cout<<s1<<' '<<s2<<' '<<s3<<' '<<endl;
}
if(flag)break;
}
if(flag==0)
flag=findstr("anniversa","r","y"); //因为我上面用的分解s0的方法缺了这个情况,导致WA一次
if(flag==0)cout<<"NO"<<endl;
}
return 0;
}
1003:
题意:求一个数m,看看他是否能用最少的3*n*(n-1)+1表示出来,我实在看不出有什么规律,开始是用的暴力破解,果然超时~~~~~~~
WA代码:
#include<queue>
#include<stack>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
int main()
{
LL a[20005];
for(int i=1;i<20001;i++)
a[i]=3*i*(i-1)+1;
LL m;
int T;
cin>>T;
while(T--)
{
cin>>m;
int i,flag=0;
LL minn=1000000006;
for( i=20000;a[i]>m;i--);
for(int j=i;j>0;j--){
int mm=m;
while(mm){
if(mm-a[j]<0)j--;
else {mm-=a[j];flag++;}
}
if(minn>flag)minn=flag;
j=--i;
}
cout<<minn<<endl;
}
return 0;
}
题解说是有规律,附上链接:
AC代码是: