1. 全网最详细且有注释的代码,有错误给老子指出,但是老子也不改
7-1
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=10003;
struct node
{
int milk;
int weight;
}Node[maxn];
vector<int> LR,RL;
int n;
int main()
{
cin >> n;
for(int i=0; i<n; i++)
{
cin >> Node[i].weight;
}
Node[0].milk=200;
LR.push_back(Node[0].milk);
for(int i=1; i<n; i++)
{
if(Node[i].weight>Node[i-1].weight)
{
Node[i].milk=Node[i-1].milk+100;
}
else if(Node[i].weight==Node[i-1].weight)
{
Node[i].milk=Node[i-1].milk;
}
else
{
Node[i].milk=200;
}
LR.push_back(Node[i].milk);
}
Node[n-1].milk=200;
RL.push_back(Node[n-1].milk);
for(int i=n-2; i>=0; i--)
{
if(Node[i].weight>Node[i+1].weight)
{
Node[i].milk=Node[i+1].milk+100;
}
else if(Node[i].weight==Node[i+1].weight)
{
Node[i].milk==Node[i+1].milk;
}
else
{
Node[i].milk=200;
}
RL.push_back(Node[i].milk);
}
reverse(RL.begin(),RL.end());
int sum=0,temp;
for(int i=0; i<n; i++)
{
temp=max(LR[i],RL[i]);
sum+=temp;
}
cout << sum;
}
2
7-2
#include<iostream>
using namespace std;
const int maxn=10003;
int a[maxn];
int n,money,temp;
void DFS(int index, int sum, int num)
{
if(index>=n || sum>money)
{
temp=num;
return ;
}
DFS(index+1,sum+a[index+1],num+1);
}
int main()
{
cin >> n >> money;
int all=0;
for(int i=0; i<n; i++)
{
cin >> a[i];
}
for(int i=0; i<n; i++)
{
DFS(i,a[i],0);
all+=temp;
}
cout << all;
return 0;
}
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int maxn=21;
int Pre[maxn],In[maxn];
vector<int> cigar;
struct node
{
int data;
node *lchild;
node *rchild;
};
node *create(int inL, int inR, int preL, int preR)
{
node *root=new node;
root->data=Pre[preL];
if(preL>preR)
return NULL;
int k;
for(k=inL; k<=inR; k++)
{
if(In[k]==Pre[preL])
{
break;
}
}
int num=k-inL;
root->lchild=create(inL,k-1,preL+1,preL+num);
root->rchild=create(k+1,inR,preL+num+1,preR);
}
void layer(node *root)
{
queue<node*> q;
q.push(root);
while(!q.empty())
{
int ans=q.size();
for(int i=0; i<ans; i++)
{
node *top=q.front();
if(i==0)
{
cigar.push_back(top->data);
}
if(top->lchild!=NULL)
{
q.push(top->lchild);
}
if(top->rchild!=NULL)
{
q.push(top->rchild);
}
q.pop();
}
}
}
int n;
int main()
{
cin >> n;
for(int i=0; i<n; i++)
{
cin >> In[i];
}
for(int i=0; i<n; i++)
{
cin >> Pre[i];
}
node *root=create(0,n-1,0,n-1);
layer(root);
for(int i=0; i<cigar.size(); i++)
{
if(i!=0)
cout << " ";
cout << cigar[i];
}
return 0;
}
7-4
#include<iostream>
#include<vector>
using namespace std;
const int maxn=1004;
const int INF=100000000;
int n,m;
struct Edge
{
int v,score,daijinquan;
Edge(int _v, int _score, int _daijinquan):v(_v),score(_score),daijinquan(_daijinquan){
};
};
vector<Edge> graph[maxn];
int in[maxn];
int pre[maxn];
void Dijkstra()
{
int visited[maxn];
int dis_score[maxn];
int dis_daijinquan[maxn];
fill(visited,visited+maxn,false);
fill(dis_score,dis_score+maxn,INF);
fill(dis_daijinquan,dis_daijinquan+maxn,0);
for(Edge t:graph[n])
{
dis_score[t.v]=dis_daijinquan[t.v]=0;
pre[t.v]=n;
}
for(int k=0; k<n; k++)
{
int min_node=n;
int min_dis=INF;
for(int i=0; i<n; i++)
{
if(visited[i]==true)
continue;
if(min_dis>dis_score[i])
{
min_dis=dis_score[i];
min_node=i;
}
else if(min_dis==dis_score[i])
{
if(dis_daijinquan[min_node]<dis_daijinquan[i])
{
min_node=i;
}
}
}
if(min_node==n)
break;
visited[min_node]=true;
for(Edge e:graph[min_node])
{
if(e.score+min_dis<dis_score[e.v])
{
pre[e.v]=min_node;
dis_score[e.v]=e.score+min_dis;
dis_daijinquan[e.v]=e.daijinquan+dis_daijinquan[min_node];
}
else if(e.score+min_dis==dis_score[e.v])
{
if(e.daijinquan+dis_daijinquan[min_node]>dis_daijinquan[e.v])
{
pre[e.v]=min_node;
dis_daijinquan[e.v]=e.daijinquan+dis_daijinquan[min_node];
}
}
}
}
}
void consist()
{
printf("Okay.\n");
Dijkstra();
int k;
cin >> k;
for(int i=0; i<k; i++)
{
int ant;
cin >> ant;
if(pre[ant]==n)
printf("You may take test %d directly.\n",ant);
else
{
vector<int> path;
while(ant!=n)
{
path.push_back(ant);
ant=pre[ant];
}
int l=path.size();
printf("%d",path[l-1]);
for(int j=l-2; j>=0; j--)
{
printf("->%d",path[j]);
}
printf("\n");
}
}
}
void not_consist()
{
printf("Impossible.\n");
int k;
cin >> k;
for(int i=0; i<k; i++)
{
int ans;
cin >> ans;
if(in[ans]==0)
{
printf("You may take test %d directly.\n",ans);
}
else
{
printf("Error.\n");
}
}
}
bool choice()
{
int visited[maxn]={
false};
for(int i=0; i<n; i++)
{
int node=0;
for(; node<n; node++)
{
if(!visited[node] && in[node]==0)
{
break;
}
}
if(node==n)
break;
visited[node]=true;
for(Edge t:graph[node])
{
in[t.v]--;
}
}
int num=0;
for(int i=0; i<n; i++)
{
if(in[i]==0)
num++;
}
if(num==n)
return true;
else
return false;
}
int main()
{
cin >> n >> m;
int temp1,temp2,temp3,temp4;
for(int i=0; i<m; i++)
{
cin >> temp1 >> temp2 >> temp3 >> temp4;
graph[temp1].push_back(Edge(temp2,temp3,temp4));
in[temp2]++;
}
for(int i=0; i<n; i++)
{
if(in[i]==0)
{
graph[n].push_back(Edge(i,0,0));
}
}
if(choice())
{
consist();
}
else
{
not_consist();
}
}