今日题目
1104 | Sum of Number Segments(蜜汁精度问题,有一个测试点没过,看了pdf才过了) | 20 | 5250 | 16448 | 0.32 |
1105 | Spiral Matrix(螺旋矩阵,有一个测试点没过,看了柳神pdf才过了) | 25 | 2922 | 9488 | 0.31 | |
1106 | Lowest Price in Supply Chain(自己写的,很棒) | 25 | 4414 | 10645 | 0.41 | |
1107 | Social Clusters(带一点点思维的并查集,自己写的只能拿到20分) | 30 | 5850 | 15149 | 0.39 | |
1108 | Finding Average(柳神的pdf解法很巧妙,需要学习) | 20 | 3640 | 14598 | 0.25 | |
1109 | Group Photo(一发AC) | 25 | 2642 | 7422 | 0.36 | |
1110 | Complete Binary Tree(有一个测试点过不了,目前还在修改) | 25 | 3407 | 13782 | 0.25 | |
1111 | Online Map(自己D的路径和迪杰斯特拉,感觉没啥问题,但就是只有20分= =) | 30 | 3446 | 13011 | 0.26 |
笔记
1108 Finding Average
用sscanf和sprintf可以直接解决,这是第一次用到这两个输入输出函数
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
double tmp;
char a[50],b[50];
cin>>n;
for(int i=0;i<n;i++){
scanf("%s",a);
sscanf(a,"%lf",&tmp);
sprintf(b,"%.2lf",tmp);
cout<<tmp<<" "<<b<<endl;
}
return 0;
}
// sscanf()
从⼀个字符串中读进与指定格式相符的数据
// sprintf()
字符串格式化命令,主要功能是把格式化的数据写⼊某个字符串中
1110 Complete Binary Tree (25分)
自己没能完全AC,看了柳神的pdf后,发现自己的思路不太一样,但是柳神的思路真的很好
自己是比深度,柳神时比下标,是完全二叉树一定最大下标为n,否则肯定有空下的
妙啊~
#include<bits/stdc++.h>
using namespace std;
int vis[10000];
vector<int>ve[10000];
int nums[10000],maxidx=-1,ans;
void dfs(int root,int idx) {
if(root==-1) return;
if(idx>maxidx){
maxidx=idx;
ans=root;
}
dfs(ve[root][0],idx*2);
dfs(ve[root][1],idx*2+1);
}
int main() {
bool flag=false;
int n,numa,numb,root=0;
cin>>n;
string a,b;
for(int i=0; i<n; i++) {
cin>>a>>b;
if(a[0]=='-') numa=-1;
else numa=stoi(a);
if(b[0]=='-') numb=-1;
else numb=stoi(b);
if(numa==-1&&numb!=-1) flag=true;
if(numa!=-1)
vis[numa]=1;
if(numb!=-1)
vis[numb]=1;
ve[i].push_back(numa);
ve[i].push_back(numb);
}
while(vis[root]) root++;
dfs(root,1);
if(maxidx==n){
printf("YES %d\n",ans);
} else printf("NO %d\n",root);
return 0;
}
1111 Online Map (30分)
自己的解法,20分
#include<bits/stdc++.h>
using namespace std;
const int maxn=505;
const int INF=0x3f3f3f3f;
int n,m;
int p[maxn],pp[maxn];
vector<int>st1,st2;
int dis[maxn],Time[maxn],vis[maxn],mp[maxn][maxn],times[maxn][maxn],vis2[maxn];
void init() {
for(int i=0; i<maxn; i++) {
for(int j=0; j<maxn; j++) {
if(i==j) {
mp[i][j]=times[i][j]=0;
} else mp[i][j]=times[i][j]=INF;
}
dis[i]=INF;
Time[i]=INF;
}
}
void dijkstra(int st) {
for(int i=0; i<n; i++) {
dis[i]=mp[st][i];
Time[i]=times[st][i];
p[i]=st;
pp[i]=st;
}
for(int i=0; i<n; i++) {
int minn=INF,flag=-1;
int MINN=INF,FLAG=-1;
for(int j=0; j<n; j++) {
if(dis[j]<minn&&!vis[j]) {
minn=dis[j];
flag=j;
}
if(Time[j]<MINN&&!vis2[j]) {
MINN=Time[j];
FLAG=j;
}
}
vis[flag]=1;
vis2[FLAG]=1;
for(int j=0; j<n; j++) {
if(dis[flag]+mp[flag][j]<dis[j]&&!vis[j]) {
dis[j]=dis[flag]+mp[flag][j];
p[j]=flag;
}
if(Time[FLAG]+times[FLAG][j]<Time[j]&&!vis2[j]) {
Time[j]=Time[FLAG]+times[FLAG][j];
pp[j]=FLAG;
}
}
}
}
int main() {
int st,en,a,b,is,c,d;
cin>>n>>m;
init();
for(int i=0; i<m; i++) {
cin>>a>>b>>is>>c>>d;
if(is==0) {
mp[a][b]=mp[b][a]=min(mp[a][b],c);
times[a][b]=times[b][a]=min(times[a][b],d);
} else {
mp[a][b]=min(mp[a][b],c);
times[a][b]=min(times[a][b],d);
}
}
cin>>st>>en;
dijkstra(st);
p[st]=pp[st]=-1;
int fin=en;
while(fin!=-1) {
st1.push_back(fin);
fin=p[fin];
}
fin=en;
while(fin!=-1) {
st2.push_back(fin);
fin=pp[fin];
}
if(st1==st2) {
printf("Distance = %d; Time = %d: ",dis[en],Time[en]);
for(int i=st1.size()-1; i>=0; i--) {
printf("%d%s",st1[i],i==0?"\n":" -> ");
}
} else {
printf("Distance = %d: ",dis[en]);
for(int i=st1.size()-1; i>=0; i--) {
printf("%d%s",st1[i],i==0?"\n":" -> ");
}
printf("Time = %d: ",Time[en]);
for(int i=st2.size()-1; i>=0; i--) {
printf("%d%s",st2[i],i==0?"\n":" -> ");
}
}
return 0;
}
哪里有问题呀,孩子快哭了QAQ,明天再看吧,感觉不是一时半会能改(重做)完的,晚安QAQ