1.
模拟,计算完差分数组后判断原数组和差分数组是否符合题意
#include<bits/stdc++.h> using namespace std; #define int long long #define maxx 1100000 int n; int all[maxx]; int cf[maxx]; signed main() { cin>>n; for(int i=1;i<=n;++i) cin>>all[i]; for(int i=1;i<n;++i) cf[i]=all[i+1]-all[i]; for(int i=1;i<n;++i) if(all[i]>=all[i+1]) { cout<<"No"; return 0; } for(int i=1;i<n-1;++i) if(cf[i]<=cf[i+1]) { cout<<"No"; return 0; } cout<<"Yes"; }2.计算距离原点距离判断得分,特判过大距离
#include<bits/stdc++.h> using namespace std; #define int long long int x,y; signed main() { cin>>x>>y; for(int i=1;i<=11;++i) { if(x*x+y*y<=i*i) { cout<<11-i; return 0; } } cout<<0; }3.动态规划,dp[n][n]表示当前处理到第i个数据,最后消灭的怪物在j位置。先对数据进行排序保证后效性,即不可能出现下标大的位置向下标小位置的转移。
随后初始化,递推方程为
dp[i][j]=dp[i-1][j](i!=j,代表此处妖怪未消灭)
dp[i][i]=max(dp[i-1][j]+1)(代表消灭I处妖怪且j处妖怪两个属性均大于i)
dp[i][i]=max(dp[i-1][j]+1)(代表消灭I处妖怪且j处妖怪两个属性均大于i)
#include<bits/stdc++.h> using namespace std; #define int long long #define maxx 1100 #define INF 0x3f3f3f3f int n,h,a,ans; pair<int,int> all[maxx]; int dp[maxx][maxx]; bool cmp(pair<int,int> a,pair<int,int> b) { if(a.first!=b.first) return a.first>b.first; return a.second>b.second; } signed main() { cin>>n>>h>>a; for(int i=1;i<=n;++i) cin>>all[i].first; for(int i=1;i<=n;++i) cin>>all[i].second; sort(all+1,all+1+n,cmp); for(int i=0;i<=n;++i) for(int j=0;j<=n;++j) dp[i][j]=-INF; for(int i=1;i<=n;++i) { if(all[i].first<h&&all[i].second<a) dp[i][i]=1; } for(int i=1;i<=n;++i) for(int j=1;j<i;++j) {dp[i][j]=max(dp[i][j],dp[i-1][j]); if(all[i].first<all[j].first&&all[i].second<all[j].second) dp[i][i]=max(dp[i][i],dp[i-1][j]+1);} for(int j=1;j<=n;++j) ans=max(ans,dp[n][j]); cout<<ans; }4.最小生成树,注意要预先处理必选边,且最后判断树是否联通。
#include<bits/stdc++.h> using namespace std; #define int long long #define maxx 201000 int fa[maxx]; int n,m,neww1,c,a,b,ans,d,neww; struct mre { int from,to,val,jh; }; struct mre E[maxx]; struct mre B[maxx]; vector<int> ans1; bool cmp(struct mre a,struct mre b) { return a.val<b.val; } int find(int x) { while(x!=fa[x]) x=fa[x]=fa[fa[x]]; return x; } signed main() { cin>>n>>m; for(int i=1;i<=n;++i) fa[i]=i; for(int i=1;i<=m;++i) {cin>>a>>b>>c>>d; if(d==1) { B[++neww1].from=a; B[neww1].to=b; B[neww1].val=c; B[neww1].jh=i; } else { E[++neww].from=a; E[neww].to=b; E[neww].val=c; E[neww].jh=i; } } sort(E+1,E+neww+1,cmp); for(int i=1;i<=neww1;++i) { a=find(B[i].from); b=find(B[i].to); c=B[i].val; if(a!=b) fa[a]=b; ans1.push_back(B[i].jh); ans+=c; } for(int i=1;i<=neww;++i) { a=find(E[i].from); b=find(E[i].to); c=E[i].val; if(a==b) continue; ans1.push_back(E[i].jh); ans+=c; fa[a]=b; } a=find(1); for(int i=2;i<=n;++i) { if(a!=find(i)) { cout<<"-1"; return 0; } } cout<<ans1.size()<<"\n"; for(int i=0;i<ans1.size();++i) cout<<ans1[i]<<" "; }