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;
}