#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a,b,c;
int main()
{
ll n;
ll l,r,mid;
cin>>n>>a>>b>>c;
ll ans=0;
ans=n/a;
ll cc=0;
if(n>=b)cc=(n-b)/(b-c)+1;
ll m=n-cc*b+cc*c;
cc+=m/a;
m=n-ans*a;
if(m>=b)
ans+=(m-b)/(b-c)+1;
ans=max(ans,cc);
cout<<ans<<endl;
}
题意:给出两个字符串,后一个为子串求前面字符串中拥有的最少子串数,如此
可以直接暴力匹配即可,只是匹配时要注意已匹配的字符串不可重复匹配。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
string s1,s2;
int main()
{
cin>>s1>>s2;
int n=s1.length();
int m=s2.length();
int i,j;
i=0;
int cnt=0;
int k;
while(i<n){
j=0;
if(s1[i]==s2[j]){
k=i;
while(j<m&&k<n&&s1[k]==s2[j])
{
k++;
j++;
}
if(j>=m){ i=k;cnt++;}
else i++;
}
else i++;
}
cout<<cnt<<endl;
}
题意:求n*n的矩阵,k列为所有列值最大,每行为升序。
直接构造矩阵即可(数字是1~n^2)
1~k-1列数字必定小于n*(k-1)则为方便及保证从大到小,则从1~n*(k-1)按行保存前k-1列,再后续按行存下后n-k+1列.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
const int N=505;
int a[N][N];
int main()
{
int n,k;
cin>>n>>k;
int t=1;
for(int i=1;i<=n;i++)
for(int j=1;j<k;j++){
a[i][j]=t++;
}
for(int i=1;i<=n;i++){
for(int j=k;j<=n;j++){
a[i][j]=t++;
}
}
int sum=0;
for(int i=1;i<=n;i++)
sum+=a[i][k];
cout<<sum<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}