加工生产调度
没咋理解
记住就好吧
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1100;
int n;
struct node{
int a;
int b;
int num;//序号
int min;
};
struct node q[N];
int a[N];
int b[N];
bool cmp(node x, node y){
return x.min<y.min;
}
int t[N];
int main(){
while(cin>>n){
for(int i=1;i<=n;i++){
cin>>q[i].a;
a[i]=q[i].a;
}
for(int i=1;i<=n;i++){
cin>>q[i].b;
b[i]=q[i].b;
}
for(int i=1;i<=n;i++)
q[i].num=i;
for(int i=1;i<=n;i++)
q[i].min=min(q[i].a,q[i].b);
sort(q+1,q+1+n,cmp);
//按照min值排序
int f=1,l=n;
for(int i=1;i<=n;i++){
if(q[i].min==q[i].a){
//如果a小,那么放在前面
t[f]=q[i].num;
f++;
}
else{
t[l]=q[i].num;
l--;
}
}
int sa=0,sb=0;
for(int i=1;i<=n;i++){
sa+=a[t[i]];
if(sa>sb)
sb=sa;
sb+=b[t[i]];
}
cout<<sb<<endl;
}
return 0;
}
Cow Party
迪杰斯特拉算法,记住模板
超时版本
#include<iostream>
#include<algorithm>
#include<cstring>
#include <climits>
using namespace std;
int n,m,x;
const int N=1002;
int g[N][N];
int dist[N][N];
bool st[N];
int dist_back[N];
bool sq[N];
void dijkstra(int x){
memset(dist[x],0x3f,sizeof dist[x]);
memset(st,0,sizeof st);
dist[x][x]=0;//初始化别忘了
for(int i=1;i<=n;i++){
int t=-1;
for(int j=1;j<=n;j++){
if(!st[j]&&(t==-1||dist[x][j]<dist[x][t]))
t=j;
}
for(int j=1;j<=n;j++)
dist[x][j]=min(dist[x][j],dist[x][t]+g[t][j]);
st[t]=true;//这里别忘了
}
}
void dijkstra_back(int x){
memset(dist_back,0x3f,sizeof dist_back);
dist_back[x]=0;//初始化别忘了
for(int i=1;i<=n;i++){
int t=-1;
for(int j=1;j<=n;j++){
if(!sq[j]&&(t==-1||dist_back[j]<dist_back[t]))
t=j;
}
for(int j=1;j<=n;j++)
dist_back[j]=min(dist_back[j],dist_back[t]+g[t][j]);
sq[t]=true;//这里别忘了
}
}
int main(){
cin>>n>>m>>x;
memset(g,0x3f,sizeof g);
while(m--){
int x,y,z;
cin>>x>>y>>z;
g[x][y]=min(g[x][y],z);//处理重边,因为短的边比长的好
}
for(int i=1;i<=n;i++){
dijkstra(i);
}
dijkstra_back(x);
int max=0;
for(int i=1;i<=n;i++){
if(dist[i][x]+dist_back[i]>max)
max=dist[i][x]+dist_back[i];
}
cout<<max<<endl;
return 0;
}