1001 A+B Format (20分)
Do not forget to use using namespace std;
string to int: use str=to_string(int)
string’s length: .length(str)
insert a character in string: str.insert(len-3,",");
1002 A+B for Polynomials (25分)
polynomial 多项式(的)
exponents and coefficients 指数和系数
respectively 依次为
use #include<bits/stdc++.h>
, which includes most of frequently-used header files.
保留一位小数:cout<<setprecision(1)<<std::fixed<<c[i];
网上多直接printf(" %d %.1f", i, p[i]);
向下取整,据说四舍五入会特别标明。
1003 Emergency (25分)
scattered 分散的
Dijkstra算法求最短路径,这道题的难度是求最短路径的条数以及最短路径中的条件最优解。作为一般的Dijkstra算法将这道题放上来供参考:
#include<bits/stdc++.h>
#define N 501
#define M 0x3f3f3f3f
using namespace std;
int main(){
int mp[N][N];
int r[N];
int n,m,c1,c2,p1,p2,l;
int flag[N];
int d[N];
int p[N];
int way[N];
int rs[N];
cin>>n>>m>>c1>>c2;
for(int i=0;i<n;i++){
cin>>r[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
mp[i][j]=M;
}
}
for(int i=0;i<m;i++){
cin>>p1>>p2>>l;
mp[p1][p2]=l;
mp[p2][p1]=l;
}
for(int i=0;i<n;i++){
d[i]=mp[c1][i];
flag[i]=0;
way[i]=1;
rs[i]=0;
if(d[i]<M&&i!=c1){
p[i]=c1;
rs[i]=r[i]+r[c1];
}
}
int k=c1;
flag[k]=1;
d[k]=0;
rs[k]+=r[k];
int minn;
for(int i=1;i<n;i++){
minn=M;
for(int j=0;j<n;j++){
if((!flag[j])&&d[j]<minn){
minn=d[j];
k=j;
}
}
flag[k]=1;
for(int j=0;j<n;j++){
if(d[j]==d[k]+mp[k][j]){
way[j]+=way[k];
if(rs[j]<rs[k]+r[j])rs[j]=rs[k]+r[j];
}
else if(d[j]>d[k]+mp[k][j]){
d[j]=d[k]+mp[k][j];
p[j]=k;
way[j]=way[k];
rs[j]=rs[k]+r[j];
}
}
}
cout<<way[c2]<<" "<<rs[c2]<<endl;
return 0;
}
本题中不需要p[],它是用来回溯路径的~
总结一下一般的Dijkstra算法的步骤:
- 创建邻接矩阵(N<1000,否则用邻接链表),赋初值0x3f3f3f3f;
- 双向赋值长度;
- 各点标志赋0,指向起点的点上一个点是起点,距起点距离赋上;
- 起点标志赋1,开始循环;
- 使用中间值寻找标志0的最小距离的点;
- 更新各点距离,各点原距离与上点距离与两点距离之和,取小者,若更新了距离,该点指向上点;
- 如需计算条数,若更新了距离,该点条数更新为上点的,若相等,该点条数加上上点的;
- 输出终点条数距离,按照上点回溯获得路线。