国庆模拟赛DAY0202

A. 神秘金币

排序。

读完题后我们可以发现,其实我想那哪些金币就拿哪些金币,因为不管怎样,我们都能安排一个合适的时间段来拿金币;所以题目就变成了给你nn个数,让你求出前kk的数的和。

#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. 学习乘法

这道题目在写的时候没有想到大小的问题,所以只得了6060分,下一次要注意细节。

贪心。

这道题目我们可以构造出两个数来,我们知道,对于任意两个数,差越小,积越大。所以我们可以让一个数的最高位最大,其余位小,再让一个数的最高位最小,其余位大,那用什么数据结构呢?用字符串,因为用字符串它方便交换,在最后化为整数即可,最后直接乘起来即为答案。

#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. 饮料难题

高精度。

这道题目找规律后可以发现公式为:

n/k1n/(k-1)

但是数据范围太大了,所以要写高精度除低精度。

注意:要开longlong longlong,不然只能拿4040分(我就是这样的,还要被罚写55遍,下一次遇见题目只要是10910^9都要开longlong longlong)。

#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;
}