CSDN 第三十九期竞赛题解(吐槽向

开局省流:

      1.关于第一题我必须吐槽一下,我圆周率背到3.14159265358没过,这个设定有点麻了~~~。

      2.第二题狠狠的吐槽,关于m个朋友,我赛时用assert(x>=1)报错,很好奇这个数据什么鬼,时间基本都花在这题了,我之前用vector存下m个朋友信息再处理,完全一样的逻辑报错了。看到很多兄弟T2都卡最后一个用例就很离谱emm(我也卡这个很久)。

      3.喜提wa1,入手一次股票可以买很多股哦。

      4.吐槽,这题也没一遍过,开始以为可以混搭,没想到这么公平的老师,就是枚举三种情况就完事了。

      我严重怀疑第二题有bug~~~也希望比赛越做越好哦

1、题目名称:圆小艺 最近小艺酱渐渐变成了一个圆滑的形状-球!! 小艺酱开始变得喜欢上球! 小艺酱得到n个同心圆。 小艺酱对着n个同心圆 进行染色。 相邻的圆范围内不能有相同的颜色。相隔一层的圆颜色相同。 小艺酱想知道两种颜色中最外层圆的那种颜色总 共染了多少?

关于第一题我必须吐槽一下,我圆周率背到3.14159265358没过,这个设定有点麻了~~~。

#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
double ans;vector<double>x(n);
for(int i=0;i<n;i++){
cin>>x[i];
}
sort(x.begin(),x.end());int k=1;
for(int i=n-1;i>=0;i--){
ans+=x[i]*x[i]*3.1415926535897932384626*k;
k=-k;
}
// ans*=ans*3.1415926;
printf("%.3lf",ans);
}

2、题目名称:近视的小张 小张和他的 M 个朋友来到了一个十分神奇的地方,在这里有 N 个 柱子, 对于每个 1 P[j] && H[i] A[j], 那么第 i 个柱子无法被清晰看见。 请你计算出每个小张的朋友能清晰看到的最远一个柱子的位置, 如果那个朋友一个柱子都没有清晰看到, 请输出 -1。 此题由CSDN用户a23333a提供。

第二题狠狠的吐槽,关于m个朋友,我赛时用assert(x>=1)报错,很好奇这个数据什么鬼,时间基本都花在这题了,我之前用vector存下m个朋友信息再处理,完全一样的逻辑报错了。看到很多兄弟T2都卡最后一个用例就很离谱emm(我也卡这个很久)。

这题本质上就是一个判断柱子理论上能否看(能看到加入集合)到再加个二分就搞定了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int n,m;
cin>>m>>n;
assert(n<=100000);
vector<pair<int,int>>a(n);
for(int i=0;i<n;i++)cin>>a[i].second;
for(int i=0;i<n;i++){cin>>a[i].first;assert(a[i].first>=1);}
sort(a.begin(),a.end());
int tp=-1000000;
vector<int>id;
id.push_back(-1);
for(int i=0;i<n;i++){
if(a[i].second>tp){tp=a[i].second;id.push_back(a[i].first);}
}
assert(tp<=1000000000);vector<int>ans;
for(int i=0;i<m;i++){
int x;cin>>x;
int l=0,r=id.size()-1;
while(l<=r){
int mid=(l+r)>>1;
if(id[mid]<=x)l=mid+1;
else r=mid-1;
}
ans.push_back(id[r]);
}
// sort(ans.begin(),ans.end());
for(auto r:ans)cout<<r<<endl;
return 0;
}

3、题目名称:小股炒股 已知n天后的股票行情,现在已有的本金是m, 规定只能入手一次股票和抛售一次股票。 最大收益(含本金)是?

喜提wa1,入手一次股票可以买很多股哦。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int main() {
int n,m;
cin>>n>>m;
vector<int>a(n),pre(n);
for(int i=0;i<n;i++)cin>>a[i];
int mx=0;
for(int i=n-1;~i;--i){
pre[i]=mx;
mx=max(mx,a[i]);
}
int ans=-9999;
for(int i=0;i<n;i++)
{
int num=m/a[i];
ans=max(ans,num*pre[i]-num*a[i]);
}
ans+=m;
cout<<ans<<endl;
}

4、题目名称:买铅笔 P老师需要去商店买n支铅笔作为小朋友们参加编程比赛的礼物。她发现商店一共有 3 种包装的铅笔,不同包装内的铅笔数 量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。 商店不允许将铅笔的包装拆开, 因此P老师可能需要购买超过 n 支铅笔才够给小朋 友们发礼物。 现在P老师想知道,在商店每种包装的数量都足够的情况 下,要买够至少 n 支铅笔最少需要花费多少钱。

吐槽,这题也没一遍过,开始以为可以混搭,没想到这么公平的老师,就是枚举三种情况就完事了。

#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
vector<pair<int,int>>p(3);
for(int i=0;i<3;i++)cin>>p[i].first>>p[i].second;
//sort(p.begin(),p.end(),cmp);
int ans=1e9;
for(int i=0;i<3;i++)
ans=min(ans,(n+p[i].first-1)/p[i].first*p[i].second);
cout<<ans<<endl;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值