1雷达安装(题目链接)
这个题去年在校内的一次训练赛上做过,当时候和现在的思路差不多但是wa了无数次,我今天才明白为什么错。这个题可以用贪心的思路做,每一个都找多所需球心的最左和最右的坐标。关键是贪心是每一次尽可能的让一个新的雷达横坐标尽可能的大,所以排序的时候应该按照每一个小岛的所需最右坐标排序。具体代码如下。
#include<cmath>
#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#include<math.h>
#include<stack>
#include<algorithm>
#include<queue>
#include<bitset>
#define ll long long int
const int mod=1e9+7;
using namespace std;
struct node
{
double l,r;
}a[20010];
bool cmp(node p,node q)
{
return p.r<q.r;
}
int main()
{
ios::sync_with_stdio(false);
int i,j,q,sum=0,k,p,n,m;
cin>>n>>m;
for(i=0;i<n;i++)
{
double x,y;
cin>>x>>y;
if(abs(y)>m)
{
cout<<-1;
return 0;
}
a[i].l=x-sqrt(m*m-y*y);
a[i].r=x+sqrt(m*m-y*y);
}
sort(a,a+n,cmp);
int tem=1;
double te=a[0].r;
for(i=1;i<n;i++)
{
if(a[i].l>te)
{
tem++;
te=a[i].r;
}
}
cout<<tem;
return 0;
}
2密令(题目链接)
这个题属于数论和动态规划的结合。每一个字符用数字表示,那么每一个序列无论如何变换,其和是一定的,所以每一个长度固定且和确定的字符串,其排列的种数是一定的。d[i][j]表示有i个字符,和为j。则有动态方程d[i[j]=∑(0<=k<26)d[i−1][j−k]。具体代码如下。
#include<cmath>
#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#include<math.h>
#include<stack>
#include<algorithm>
#include<queue>
#include<bitset>
#define ll long long int
const int mod=1e9+7;
using namespace std;
int d[101][2701];
string s;
int main()
{
ios::sync_with_stdio(false);
int i,j,q,sum=0,k,p,n,m;
for(i=0;i<26;i++)
d[1][i]=1;
for(i=2;i<=100;i++)
{
for(j=0;j<=i*26;j++)
{
d[i][j]=0;
for(k=0;k<26;k++)
{
d[i][j]+=d[i-1][j-k]%mod;
d[i][j]%=mod;
}
}
}
cin>>n;
while(n--)
{
cin>>s;
int len=s.length(),lp=0;
for(i=0;i<len;i++)
{
lp+=s[i]-'a';
}
cout<<d[len][lp]-1<<endl;
}
return 0;
}
3单源最短路径(题目链接)
这个题是迪杰斯特拉的优先队列优化的模板题,可以帮助新手更快,更好的了解迪杰斯特拉,这个题来自于洛谷的4779,洛谷的3371是这个题的数据弱化版,俩个题目的要求有一点不一样,差点让我以为数据有问题。具体代码如下。
#include<cmath>
#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#include<math.h>
#include<stack>
#include<algorithm>
#include<queue>
#include<bitset>
#define ll long long int
const int mod=1e9+7;
using namespace std;
ll f[500010],ap=0,dis[500010],bi[500010];
struct node
{
ll ne,w,to;
}ed[500010];
void add(ll x,ll y,ll wi)
{
ed[++ap].w=wi;
ed[ap].ne=f[x];
ed[ap].to=y;
f[x]=ap;
}
priority_queue<pair<ll,ll> >p;
int main()
{
ios::sync_with_stdio(false);
ll n,m,s,i,j,k;
cin>>n>>m>>s;
memset(bi,0,sizeof(bi));
for(i=1;i<=n;i++)
{
dis[i]=1e16;
}
for(i=0;i<m;i++)
{
ll x,y,w;
cin>>x>>y>>w;
add(x,y,w);
}
dis[s]=0;
p.push(make_pair(0,s));
while(!p.empty())
{
ll x=p.top().second;
p.pop();
if(bi[x])
continue;
bi[x]=1;
for(i=f[x];i;i=ed[i].ne)
{
if(dis[ed[i].to]>dis[x]+ed[i].w)
{
dis[ed[i].to]=dis[x]+ed[i].w;
p.push(make_pair(-dis[ed[i].to],ed[i].to));
}
}
}
for(i=1;i<=n;i++)
cout<<dis[i]<<" ";
return 0;
}