B - … (Triple Dots)
題意:
讓你把一個string的長度變爲小於k。大於部分用省略號。
總結:
- string 裏的 s.substr(地址,長度)。
此函數功能是取子串。
AC
#include <iostream>
#include <string>
using namespace std;
int main()
{
int k;
cin>>k;
string s,t;
cin>>s;
int len=s.size();
if(len>k)
{
s=s.substr(0,k);
t="...";
s+=t;
cout<<s<<endl;
}
else cout<<s<<endl;
return 0;
}
C - : (Colon)
思路:
給你一個時間,要你求時針和分針的角度。
三角函數餘弦定理去求即可。
反思:
沒有考慮到分針對時針的影響。
AC
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const double pi=acos(-1.0);
int main()
{
double a,b;
double h,m;
cin>>a>>b>>h>>m;
h=h+m/60.0;
m=m/5.0;
double num=fabs(h-m);
if(num>6.0)num=12.0-num;
// cout<<num<<endl;
double angle=num/12.0*360*pi/180.0;
//cout<<angle<<endl;
//cout<<cos(angle)<<endl;
double dis=a*a+b*b-2*a*b*cos(angle);
printf("%.9f\n",sqrt(dis));
return 0;
}
D - … (Double Dots)
思路:
給你一個無向圖,要你找到進行標記,使得從任意一點,都可以到1號點。
用 sign【】標記上一個位置即可。
下面介紹兩種方法
- dij的話,直接反向跑最短路。
- 可以直接遍歷圖。bfs//由於是跑bfs所以更新一次就是最短了(邊權爲1)
AC(dij)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#define mp make_pair
#define fi first
#define se second
#define fzhead EDGE(int _to, int _val, int _next)
#define fzbody to(_to), val(_val), next(_next)
#define mst(x,a) memset(x,a,sizeof(x))
#define For(i,x,y) for( int i=(x); i<=(y); i++)
using namespace std;
const int maxm=2e5+10;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
typedef pair<int,int>pa;
struct EDGE
{
int to,val,next;
EDGE(){}
fzhead:fzbody{}
}e[maxm<<1];
int cnt,head[maxn],vis[maxn];
int n,m;
int dis[maxn],sign[maxn];
void add(int bg, int to, int val)
{
e[++cnt]=EDGE(to,val,head[bg]);
head[bg]=cnt;
}
void dij(int s)
{
For(i,1,n)vis[i]=0;
priority_queue<pa>q;
dis[s]=0;q.push(mp(0,s));
while(!q.empty())
{
int u=q.top().se;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=head[u]; i!=-1; i=e[i].next)
{
if(dis[e[i].to]>dis[u]+e[i].val)
{
dis[e[i].to]=dis[u]+e[i].val;
sign[e[i].to]=u;
q.push(mp(-dis[e[i].to],e[i].to));
}
}
}
}
int main()
{
mst(dis,0x3f);mst(head,-1);
scanf("%d%d", &n,&m);
For(i,1,m)
{
int a,b;
scanf("%d%d", &a,&b);
add(a,b,1);add(b,a,1);
}
dij(1);
int flag=1;
For(i,2,n)if(dis[i]==0x3f3f3f3f){flag=0;break;}
if(flag)
{
cout<<"Yes"<<endl;
For(i,2,n)cout<<sign[i]<<endl;
}
else cout<<"No"<<endl;
return 0;
}
/*
spfa
queue<int>q;
dis[s]=0;
q.push(1);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u]; i!=-1; i=e[i],next)
{
int v=e[i].to,w=e[i].val;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
q.push(v);
vis[v]++;
if(vis[v])
}
}
}
*/
AC(BFS)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#define mp make_pair
#define fi first
#define se second
#define fzhead EDGE(int _to, int _val, int _next)
#define fzbody to(_to), val(_val), next(_next)
#define mst(x,a) memset(x,a,sizeof(x))
#define For(i,x,y) for( int i=(x); i<=(y); i++)
using namespace std;
const int maxm=2e5+10;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
typedef pair<int,int>pa;
struct EDGE
{
int to,val,next;
EDGE(){}
fzhead:fzbody{}
}e[maxm<<1];
int cnt,head[maxn],vis[maxn];
int n,m;
int sign[maxn];
void add(int bg, int to, int val)
{
e[++cnt]=EDGE(to,val,head[bg]);
head[bg]=cnt;
}
int main()
{
mst(head,-1);
scanf("%d%d", &n,&m);
For(i,1,m)
{
int a,b;
scanf("%d%d", &a,&b);
add(a,b,1);add(b,a,1);
}
queue<int>q;
q.push(1);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u]; i!=-1; i=e[i].next)
{
int v=e[i].to;
if(!sign[v])//由於是跑bfs所以更新一次就是最短了(邊權爲1)
{
sign[v]=u;
q.push(v);
}
}
}
cout<<"Yes"<<endl;
For(i,2,n)cout<<sign[i]<<endl;
return 0;
}