牛客周赛 Round 17

A、

题目描述:

游游拿到了一个边长为n的正方形披萨,她准备切k刀(每刀只能横着或竖着切开),最终会形成若干个小矩形披萨。游游希望每个小披萨的面积相等,且矩形的长和宽的差的绝对值尽可能小。你能帮游游求出每个小矩形的面积吗?

输入描述:

复制代码
两个正整数n和k,用空格隔开。
1≤n,k≤100

输出描述:

复制代码
一个浮点数,代表每个小矩形的面积,小数点后保留2位。

示例1

输入

复制代码
2 1

输出

复制代码
2.00

示例2

输入

复制代码
3 3

输出

复制代码
1.50
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define fp(i,a,b) for(int i=a;i<=b;++i)
#define PII pair<int,int>
const int N=2e5+10;
const int mod=1e9+7;
const double eps=1e-5;
typedef double db;
int n,k;
signed main()
{
	cin>>n>>k;
	
	int mmax=0;
	
	for(int i=0;i<=k;i++)
	{
	    int j=k-i;	
	    int x=i+1;
	    int y=j+1;
	    int sum=x*y;
	    mmax=max(mmax,sum);
    }
    cout<<fixed<<setprecision(2)<<n*n*1.0/mmax<<"\n";

	return 0;
} 

枚举即可。

B、

题目描述:

游游拿到了一个长度为n的字符串,她每次操作会选择一个区间[l,r],将第l个字母到第r个字母各重复一次,插入到该字母的后面。

例如,对于字符串"abcd",若选择区间[2,3]进行操作,字符串将变成"abbccd"

游游将进行q次操作。她想知道,q次操作结束后,最终的字符串是什么样子?

输入描述:

复制代码
第一行输入两个正整数n和q,分别代表字符串长度和操作次数。
第二行输入一个仅由小写英文字母组成的字符串,代表初始的字符串。
接下来的q行,每行输入两个正整数l,r,代表操作的区间。
1≤n≤1000
1≤q≤10
1≤l≤r≤10^6
保证每次操作时,r不大于当前的字符串长度。

输出描述:

复制代码
一个字符串,代表所有操作结束后形成的字符串。

示例1

输入

复制代码
6 2
abcdef
2 4
3 6

输出

复制代码
abbbccccdddef

说明

第一次操作后,字符串变成abbccddef

第二次操作后,字符串变成abbbccccdddef

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define fp(i,a,b) for(int i=a;i<=b;++i)
#define PII pair<int,int>
const int N=2e5+10;
const int mod=1e9+7;
const double eps=1e-5;
typedef double db;
int n,q;
string s;
signed main()
{
	cin>>n>>q;

    cin>>s;
    
    int l,r;
    fp(i,1,q)
    {
    	string t="";
    	cin>>l>>r;
    	l--;
    	r--;
    	for(int j=0;j<s.size();j++)
    	{
    		t+=s[j];
    		if(l<=j&&j<=r)
    		{
    			t+=s[j];
			}
		}
		s=t;
	}
	cout<<s<<"\n";
	return 0;
} 

暴力即可

C、

题目描述:

游游拿到了一个大小为n的数组,数组第i个数为ai​。

游游会选择一些元素,使得这些元素都等于它们的平均数。

例如,假设数组为 [5 , 4 , 2 , 4],游游选择第一个和第三个元素,最终数组将变成 [3.5 , 4 , 3.5 ,4]

游游最多可以选择k个元素,她希望最终数组最大值和最小值的差尽可能小。你能帮她求出这个差吗?

输入描述:

复制代码
第一行输入两个正整数n和k,用空格隔开。分别代表数组大小、以及游游最多可以选择的元素数量。
第二行输入n个正整数ai​,代表每个数组的元素。

1≤n,ai​≤200000

1≤k≤n

输出描述:

复制代码

一个浮点数,代表最终数组的最大值和最小值的差。

如果你的答案和正确答案的相对误差不超过10−610^{-6}10−6,则认为答案正确。

示例1

输入

复制代码
4 2
5 4 2 4

输出

复制代码
0.5

示例2

输入

复制代码
4 4
5 4 2 4

输出

复制代码
0
  1. 将数组排序

  2. 枚举选择最小值的元素数量i和最大值的元素数量j(i + j = k)

  3. 计算选择这些元素后的最小值和最大值

  4. 更新答案

    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e6+10;
    const int inf=1e9;
    #define int long long
    #define fp(i,a,b) for(int i=a;i<=b;i++)
    typedef double db;
    int n,k;
    int a[N],sum[N];
    signed main()
    {
    cin>>n>>k;

    fp(i,1,n)cin>>a[i];
    
    sort(a+1,a+1+n);
    
    fp(i,1,n)sum[i]=sum[i-1]+a[i];
    
    if(n==k)
    {
       cout<<fixed<<setprecision(6)<<0.00<<"\n";
       return 0;
    }
    
    db ans=3e18;
    
    for(int i=0;i<=k;i++)
    {
    	 int j=k-i;
    	 db x=sum[i]+sum[n]-sum[n-j];
    	 db mi=min(1.0*a[i+1],x*1.0/k);
    	 db ma=max(1.0*a[n-j],x*1.0/k);
    	 ans=min(ans,ma-mi);
    }
    
    cout<<fixed<<setprecision(6)<<ans<<"\n";
    
    
    
    
    
     return 0;
    

    }

D、

题目描述:

游游准备去开车旅行,她初始在1号城市,准备前往n号城市。

游游打开了携程,她查询到了地图上有若干城市,城市之间有一些道路连接。每条道路有承重限制,当游游的车重量超过了承重时,她就不能走这条道路。

游游是一个贪心的人,她希望总路程不超过h的前提下,携带尽可能多的物品出行。游游想知道,自己的车最多重量能达到多少?

输入描述:

复制代码
第一行输入三个正整数n,m,h,代表城市数量和道路数量,以及总路程的限制。
接下来的m行,每行输入四个正整数u,v,w,d,代表有一条道路连接了u号城市和v号城市,道路的最大承重为w,道路长度为d。
2≤n≤10^5
1≤m≤10^5
1≤u,v≤n
1≤w,d,h≤10^9

输出描述:

复制代码
如果游游无法到达n号城市,则输出-1。
否则输出一个正整数,代表游游的车的最小重量。

示例1

输入

复制代码
3 3 5
1 2 7 3
1 3 6 4
3 2 4 2

输出

复制代码
6

说明

复制代码

直接走1-3这条路,道路的承重为6。

如果走1-2-3这两条路,虽然总里程也不超过5,但由于2-3道路承重为4,所以游游的车的重量会更小。

spfa+二分 你用dijkstra也行

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int inf=2e9;
#define int long long
#define fp(i,a,b) for(int i=a;i<=b;i++)
int n,m,hh;
int e[N],ne[N],h[N],w[N],d[N],idx;
int dis[N];
bool vis[N];
void add(int x,int y,int z,int t)
{
    e[idx]=y;
    ne[idx]=h[x];
    w[idx]=z;
    d[idx]=t;
    h[x]=idx++;
}
int spfa(int x)
{
    fp(i,1,n)vis[i]=0,dis[i]=inf;
    vis[1]=1;
    dis[1]=0;
    queue<int>q;
    q.push(1);
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        vis[now]=0;
        for(int i=h[now];~i;i=ne[i])
        {
            int j=e[i];
            if(dis[j]>dis[now]+d[i]&&w[i]>=x)
            {
                dis[j]=dis[now]+d[i];
                if(vis[j]==0)
                {
                    vis[j]=1;
                    q.push(j);
                }
            }
        }
    }
    return dis[n]<=hh;
}
signed main()
{

   memset(h,-1,sizeof h);

   cin>>n>>m>>hh;

   fp(i,1,m)
   {
       int x,y,z,t;
       cin>>x>>y>>z>>t;
       add(x,y,z,t);
       add(y,x,z,t);
   }

   int l=-1,r=1e9;  
   while(l<r)
   {
   	  int mid=(l+r+1)>>1;
   	  if(spfa(mid))l=mid;
   	  else r=mid-1;
   }
   cout<<l<<"\n";
   

    return 0;
}
相关推荐
createcrystal2 小时前
《算法笔记》例题解析 第3章入门模拟--3图形输出(9题)2021-03-03
c++·笔记·算法
我要学编程(ಥ_ಥ)2 小时前
双指针算法专题(2)
数据结构·算法·leetcode
逸狼2 小时前
【JavaEE初阶】多线程6(线程池\定时器)
java·开发语言·算法
no_play_no_games3 小时前
[模板]树的最长路径
算法·深度优先·图论·树形结构
tan77º3 小时前
【C++】异常
c++·算法
ymchuangke3 小时前
数据清洗-缺失值处理-缺失值可视化图(竖线)
python·算法·数学建模
我要学编程(ಥ_ಥ)4 小时前
滑动窗口算法专题(1)
java·数据结构·算法·leetcode
niceffking4 小时前
JVM 一个对象是否已经死亡?
java·jvm·算法
大油头儿4 小时前
排序算法-冒泡排序
数据结构·算法·排序算法
真的很上进4 小时前
【Git必看系列】—— Git巨好用的神器之git stash篇
java·前端·javascript·数据结构·git·react.js