- 吴易繁 的博客
国庆模拟赛DAY02
- @ 2024-10-3 15:54:50
国庆模拟赛DAY
A. 神秘金币
排序。
读完题后我们可以发现,其实我想那哪些金币就拿哪些金币,因为不管怎样,我们都能安排一个合适的时间段来拿金币;所以题目就变成了给你个数,让你求出前的数的和。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct P{
int t,v;
};
P a[N];
bool cmp(P a,P b){
return a.v>b.v;
}
int main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i].t;
for(int i=1;i<=n;i++) cin>>a[i].v;
sort(a+1,a+1+n,cmp);
long long sum=0;
for(int i=1;i<=k;i++) sum+=a[i].v;
cout<<sum;
return 0;
}
B. 学习乘法
这道题目在写的时候没有想到大小的问题,所以只得了分,下一次要注意细节。
贪心。
这道题目我们可以构造出两个数来,我们知道,对于任意两个数,差越小,积越大。所以我们可以让一个数的最高位最大,其余位小,再让一个数的最高位最小,其余位大,那用什么数据结构呢?用字符串,因为用字符串它方便交换,在最后化为整数即可,最后直接乘起来即为答案。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n[10],m[10];
bool cmp(string a,string b){
return a>b;
}
int find(string a,string b){
for(int i=0;i<a.size();i++) if(a[i]!=b[i]) return i+1;
}
signed main(){
freopen("mul.in","r",stdin);
freopen("mul.out","w",stdout);
string a,b;
cin>>a>>b;
if(!cmp(a,b)) swap(a,b);
int idx=find(a,b);
for(int i=idx;i<a.size();i++) if(a[i]>b[i]) swap(a[i],b[i]);
int sum1=0,sum2=0;
for(int i=0;i<a.size();i++) sum1=sum1*10+(a[i]-'0'),sum2=sum2*10+(b[i]-'0');
cout<<sum1*sum2;
return 0;
}
C. 饮料难题
高精度。
这道题目找规律后可以发现公式为:
。
但是数据范围太大了,所以要写高精度除低精度。
注意:要开 ,不然只能拿分(我就是这样的,还要被罚写遍,下一次遇见题目只要是都要开 )。
#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<int> cf(vector<int> A,int b,int &r){
vector<int> res;
int t=0;
r=0;
for(int i=A.size()-1;i>=0;i--){
t=r*10+A[i];
res.push_back(t/b);
r=t%b;
}
reverse(res.begin(),res.end());
while(res.size()>1&&res.back()==0) res.pop_back();
return res;
}
signed main(){
freopen("drink.in","r",stdin);
freopen("drink.out","w",stdout);
int r;
string s;
cin>>s;
int k;
cin>>k;
k--;
vector<int> A;
for(int i=s.size()-1;i>=0;i--) A.push_back(s[i]-'0');
vector<int> C=cf(A,k,r);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
return 0;
}