A(给个数组看看是否有序)
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int num1;cin>>num1;
int num2[num1+1];
int count1=1,count2=1;
if(num1>0)cin>>num2[1];
for(int i=2;i<=num1;i++)
{
cin>>num2[i];
if(num2[i]>=num2[i-1])count1++;
if(num2[i]<=num2[i-1])count2++;
}
if(count1==num1||count2==num1)
{
cout<<"erfen is useful!";
}
else
{
cout<<"bukeyi";
}
}
B(给个四个字的字符串看看两边的值相等不)
#include<bits/stdc++.h>
using namespace std;
signed main()
{
int num1;cin>>num1;
string a;
while(num1--)
{
cin>>a;
int sum1=0;
int sum2=0;
sum1=int(a[0]-'0')+int(a[1]-'0');
sum2=int(a[2]-'0')+int(a[3]-'0');
if(sum1==sum2)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
C(用向量法看看坐标是否在三角形内)
#include<bits/stdc++.h>
using namespace std;
struct s
{
int x,y;
};
int main()
{
int x,y,z;cin>>x>>y>>z;
s b1,b2,b3;
b1.x=-x;b1.y=0;
b2.x=x-y;b2.y=-z;
b3.x=y;b3.y=z;
s f;cin>>f.x>>f.y;
s p1,p2,p3;
p1.x=-f.x;p1.y=-f.y;
p2.x=x-f.x;p2.y=-f.y;
p3.x=y-f.x;p3.y=z-f.y;
int l1=(b1.x*p1.y)-(b1.y*p1.x);
int l2=(b2.x*p2.y)-(b2.y*p2.x);
int l3=(b3.x*p3.y)-(b3.y*p3.x);
if(l1>0&&l2>0&&l3>0||l1<0&&l2<0&&l3<0)
{
cout<<"yes"<<endl;
}
else
{
cout<<"no"<<endl;
}
}
D(改字符顺便统计小写变种数)
#include<bits/stdc++.h>
using namespace std;
string pan="NEUQ ";
int main()
{
vector<string>s;
int sum=0;
string b;
while(getline(cin,b))
{
if(b[0]=='#')break;
for(int i=0;i<b.size();i++)
{ int s1=0;
int s2=0;
int o=0;
if(b[i]=='n'||b[i]=='N')
{
if(b[i+4]!=' '&&i+4<b.size())
{
while(b[i]!=' '&&i<b.size())i++;
continue;
}
else
{
if(b[i]=='n'||b[i]=='N')s1++;
if(b[i]=='N')s2++;
if(b[i+1]=='e'||b[i+1]=='E'&&i+1<b.size())s1++;
if(b[i+1]=='E'&&i+1<b.size())s2++;
if(b[i+2]=='u'||b[i+2]=='U'&&i+2<b.size())s1++;
if(b[i+2]=='U'&&i+2<b.size())s2++;
if(b[i+3]=='q'||b[i+3]=='Q'&&i+3<b.size())s1++;
if(b[i+3]=='Q'&&i+3<b.size())s2++;
if(s1==4&&s2!=4)
{
sum++;
i+=4;
}
if(s2==4)
{
b.replace(i,4,"WOW NEUQ");
i+=8;
}
}
}
}
s.push_back(b);
}
cout<<sum<<endl;
for(int i=0;i<s.size();i++)
{
cout<<s[i]<<endl;
}
}
E(dfs全遍历一边取最大即可)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int a[maxn],b[maxn],c[maxn],d[maxn];
int maxs=0;
int X,Y,Z;
void dfs(int i,int res,int x,int y,int z)
{
if(i==0)
{
maxs=max(maxs,res);
return ;
}
if(x+a[i]<X&&y+b[i]<Y&&z+c[i]<Z)
{
dfs(i-1,res+d[i],x+a[i],y+b[i],z+c[i]);
}
dfs(i-1,res,x,y,z);
}
signed main()
{
int num;cin>>num;
cin>>X>>Y>>Z;
for(int i=0;i<num;i++)cin>>a[i]>>b[i]>>c[i]>>d[i];
dfs(num,0,0,0,0);
cout<<maxs;
}
F(滑动窗口不符合条件的滑动即可保存最大值)
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int num3[N];
int num1,num2;
int main()
{
cin>>num1>>num2;
int maxs=0;
for(int i=1;i<=num1;i++)cin>>num3[i];
int jie=0;
for(int i=1,l=1;i<=num1;i++)
{
if(num3[i]==0)jie++;
while(jie>num2)
{
if(num3[l]==0)jie--;
l++;
}
maxs=max(maxs,i-l+1-jie);
}
cout<<maxs;
}
G(区间问题)
这道题一开始我用的一个简单的数学方法,比如在如果有一个数包括它的倍数在一个区间中,直接对区间左右进行取模运算看看,最近的倍数是否在区间中即可,但超时了,只能用差分数组和前缀和数组了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
signed main()
{
int num1,num2;
cin>>num1>>num2;
vector<int>sum(maxn,0);//差分数组
int l,r;
for(int i=1;i<=num1;i++)
{
cin>>l>>r;
sum[l]++;//所有覆盖区间都加1
sum[r+1]--;
}
for(int i=1;i<=maxn;i++)sum[i]+=sum[i-1];//组合前缀数组
vector<int>pan(maxn,1);
for(int i=1;i<=maxn;i++)
{
for(int i1=i;i1<=maxn;i1+=i)
{
if(sum[i1]!=0)pan[i]=0;//如果不等于0即为覆盖区间
}
}
int x;
while(num2--)//询问
{
cin>>x;
if(pan[x]==1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
H(寻找循环节)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+10;
int a[maxn];
int maps[maxn];
int n,p,k,b,t;
signed main()
{
cin>>n>>p>>k>>b>>t;
for(int i=0;i<n;i++)scanf("%lld",&a[i]);
int sum1=0;int sum2=0;
int x=0;
while(t>0)
{
if(maps[p]==2)break;//说明发现循环节
maps[p]++;
if(maps[p]==2)sum1++,sum2+=a[p];
x+=a[p];
p=(k*p+b)%n;
t--;
}
if(t>0)
{
x+=sum2*(t/sum1);
t%=sum1;
}
while(t>0)
{
x+=a[p];
p=(k*p+b)%n;
t--;
}
cout<<x;
}
I(dp)
状态转移方程i为当前数,j为拆解最大数
i==j时dp[i][j]=dp[i][j-1]+1;//i与j相等时相当于比前一种情况多一种
i<j时dp[i][j]=dp[i][i];//i<j无效情况直接继承dp[i][i]即可
i>j时dp[i][j]=dp[i][j-1]+dp[i-j][j];//等于前一个最大拆解数加上当前数与最大拆解数的差在拆解数为j的情况.举个例子,dp[10][3],dp[7][3],dp[10][2],由次大7用最大3构成的情况加上当前值用最大2构成的情况。
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int n;cin>>n;
int dp[n+1][n+1];
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++ ){
if(i == 1 || j == 1){
dp[i][j] = 1;
}else if (i == j) {
dp[i][j] = (1 + dp[i][j - 1])%998244353;
}else if (i < j) {
dp[i][j] = dp[i][i]%998244353;
}else {
dp[i][j] = (dp[i - j][j] + dp[i][j - 1])%998244353;
}
}
}
cout<<dp[n][n];
}