学习第一天
原创
©著作权归作者所有:来自51CTO博客作者Java大神的原创作品,请联系作者获取转载授权,否则将追究法律责任
今天数学学了不定方程。
为什么呢?因为我们班的数学巨神告诉我,自招喜欢考不定方程,所以就看了看,然后就发现了NOIP2017D1T1的原型(就是那个面值的那个题)。
然后,物理看了基尔霍夫定律、电路叠加原理、等效电源(戴维南定理和诺尔顿定理)。
最后信息学复习了一下最短路。
做了两道很简单的题。
第一道:租用游艇
很水了,直接dijkstra算法即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int mapp[205][205];
int d[205];
int vis[205];
void dijkstra(){
d[0]=0;
for(int i=0;i<n;i++){
int minn=0x3f3f3f3f;
int x;
for(int j=0;j<n;j++){
if(vis[j]==0&&d[j]<minn){
minn=d[j];
x=j;
}
}
vis[x]=1;
for(int j=x+1;j<n;j++){
d[j]=min(d[j],d[x]+mapp[x][j]);
}
}
}
int main(){
scanf("%d",&n);
memset(mapp,-1,sizeof(mapp));
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
scanf("%d",&mapp[i][j]);
}
}
dijkstra();
printf("%d",d[n-1]);
return 0;
}
第二道:最短路
其实,这道题出得并不严谨,它并没有说会不会有负边权,但是按照数据应该是没有的。
所以直接用log转化为加法即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MOD=9987;
int n,m;
double mapp[1005][1005];
int dis[1005][1005];
double d[1005];
int vis[1005];
void dijkstra(){
d[1]=0.0;
for(int k=0;k<n;k++){
int x;
double minn=2000000000.0;
for(int i=1;i<=n;i++){
if(vis[i]==0&&d[i]<minn){
x=i;
minn=d[i];
}
}
vis[x]=1;
for(int i=1;i<=n;i++){
if(mapp[x][i]>0){
if(d[i]>(d[x]+mapp[x][i])){
d[i]=d[x]+mapp[x][i];
}
}
}
}
}
int getAns(int cur){
if(cur==1){
return 1;
}
for(int i=1;i<=n;i++){
if(mapp[i][cur]>0&&d[cur]==(d[i]+mapp[i][cur])){
return (getAns(i)*dis[i][cur])%MOD;
}
}
}
int main(){
memset(mapp,0,sizeof(mapp));
memset(dis,-1,sizeof(dis));
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
d[i]=2000000000.0;
}
for(int i=0;i<m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
mapp[u][v]=log(w);
dis[u][v]=w;
}
dijkstra();
printf("%d",getAns(n));
return 0;
}
只是复习,就不做难题了。
这就是我的第一天。