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
-
将数组排序
-
枚举选择最小值的元素数量i和最大值的元素数量j(i + j = k)
-
计算选择这些元素后的最小值和最大值
-
更新答案
#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;
}