第一题直接算就行了为了追求手速忘了输出yes导致wa了一发。。。
第二题技巧题,直接sort,然后把最大的和其他的相减就是构成一条直线,为了满足条件就+1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define MIN(a,b) a<b ? a:b using namespace std; const double g=10.0,eps=1e-9; const int N=100000+10,maxn=10000+10,inf=0x3f3f3f; ll a[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); ll n,sum=0; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; sum+=a[i]; } sort(a,a+n); cout<<2*a[n-1]-sum+1<<endl; return 0; }
第三题没来的及写就打另一场去了。。。发现是道dp(我估计写了也写不对)用dp[i][0]表示i到i+2能否截取,dp【i】【1】表示i到i+3能否截取
然后从后向前扫一遍
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-9; const int N=10000+10,maxn=300,inf=0x3f3f3f; bool dp[N][2]; set<string>ans; int main() { ios::sync_with_stdio(false); cin.tie(0); string s; cin>>s; for(int i=s.size()-1;i>=5;i--) { if(i+2==s.size()) { dp[i][0]=1; ans.insert(s.substr(i,2)); continue; } if(i+3==s.size()) { dp[i][1]=1; ans.insert(s.substr(i,3)); continue; } if(dp[i+2][1]||(dp[i+2][0]&&s.substr(i,2)!=s.substr(i+2,2))) { dp[i][0]=1; ans.insert(s.substr(i,2)); } if(dp[i+3][0]||(dp[i+3][1]&&s.substr(i,3)!=s.substr(i+3,3))) { dp[i][1]=1; ans.insert(s.substr(i,3)); } } cout<<ans.size()<<endl; set<string>::iterator it; for(it=ans.begin();it!=ans.end();it++) cout<<*it<<endl; return 0; }
D题给一个有向有环图,从中找四个点,每个点之间的距离是最短路,求这四个点距离的最大值
先吧每个点跑一边spfa记录下i到j的最小距离,然后枚举b到c,找点a和点c,使得路径最长,但是直接全部枚举是O(n^4)会爆掉,所以用vector存一下到每个点的最长的3个距离(因为已经枚举了两个点)
然后复杂度就降到O(9n^2)了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-9; const int N=3000+10,maxn=5000+10,inf=0x3f3f3f; struct edge{ int to,Next,w; }e[maxn]; int head[N],cnt; int n,m; int d[N],ans[N][N]; void add(int u,int v) { e[cnt].to=v; e[cnt].w=1; e[cnt].Next=head[u]; head[u]=cnt++; } void spfa(int x) { bool vis[N]; memset(vis,0,sizeof vis); vis[x]=1; memset(d,inf,sizeof d); d[x]=0; queue<int>q; q.push(x); while(!q.empty()){ int s=q.front(); q.pop(); vis[s]=0; for(int i=head[s];~i;i=e[i].Next) { int W=e[i].w,To=e[i].to; if(d[s]+W<d[To]) { d[To]=d[s]+W; if(!vis[To]) { vis[To]=1; q.push(To); } } } } for(int i=1;i<=n;i++) ans[x][i]=min(ans[x][i],d[i]); } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; cnt=0; memset(head,-1,sizeof head); for(int i=0;i<m;i++) { int x,y; cin>>x>>y; add(x,y); } memset(ans,inf,sizeof ans); for(int i=1;i<=n;i++)ans[i][i]=0; for(int i=1;i<=n;i++) spfa(i); /* for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<ans[i][j]<<" "; cout<<endl; }*/ int cur=0,a,b,c,d; //求每一个点的最远距离 vector<pair<int,int> >v1[N],v2[N]; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j)continue; if(ans[i][j]<inf)v1[i].push_back(make_pair(ans[i][j],j)); if(ans[j][i]<inf)v2[i].push_back(make_pair(ans[j][i],j)); } sort(v1[i].begin(),v1[i].end()); reverse(v1[i].begin(),v1[i].end()); sort(v2[i].begin(),v2[i].end()); reverse(v2[i].begin(),v2[i].end()); } for(int i=1;i<=n;i++)//b { for(int j=1;j<=n;j++)//c { if(i==j||ans[i][j]>=inf)continue; for(int k=0;k<4&&k<v2[i].size();k++)//a { int ccc=v2[i][k].second; if(ccc==i||ccc==j)continue; for(int l=0;l<4&&l<v1[j].size();l++)//d { int ddd=v1[j][l].second; if(ddd==i||ddd==j||ddd==ccc)continue; if(cur<ans[i][j]+v1[j][l].first+v2[i][k].first) { cur=ans[i][j]+v1[j][l].first+v2[i][k].first; a=ccc,b=i,c=j,d=ddd; } } } } } //cout<<cur<<endl; cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl; return 0; }
E待补