习题日常第八练

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值