1月29日刷题笔记

今日题目

           
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

原创文章 70 获赞 25 访问量 7168

猜你喜欢

转载自blog.csdn.net/weixin_43727229/article/details/104111002
今日推荐