题目传送门

A 神秘金币

B 学习乘法

C 饮料难题

D 手术

神秘金币

思路

这里因为消失时间不同所以不用考虑时间,所以直接求第一大到第kk大的金币,记得开longlonglong long

代码

#include<bits/stdc++.h>
using namespace std;
long long n,k;
struct P{
	long long sj,jz;
}a[100010];
bool cmp(P a,P b){
	return a.jz>b.jz;
}
int main(){
	freopen("coin.in","r",stdin);
	freopen("coin.out","w",stdout);
	cin>>n>>k;
	for(long long i=1;i<=n;i++)cin>>a[i].sj;
	for(long long i=1;i<=n;i++)cin>>a[i].jz;
	sort(a+1,a+1+n,cmp);
	long long s=0,j=0,z=0;
	for(long long i=1;i<=k;i++){
		z+=a[i].jz;
	}
	cout<<z;
	return 0;	
}

错的点

考虑了时间,以后要多读题

T2学习乘法

思路

直接索索每一位的可能即可

代码

#include<bits/stdc++.h>
using namespace std;
long long ma=-100;
string a,b;
long long n;
void dfs(long long aa,long long bb,long long c){
	if(c==n){ma=max(ma,aa*bb);return;}
	long long aaa,bbb;
	aaa=aa*10+a[c]-'0';
	bbb=bb*10+b[c]-'0';
	dfs(aaa,bbb,c+1);
	aaa=aa*10+b[c]-'0';
	bbb=bb*10+a[c]-'0';
	dfs(aaa,bbb,c+1);
	return;
}
int main(){
	freopen("mul.in","r",stdin);
	freopen("mul.out","w",stdout);
	cin>>a>>b;
	n=a.size();
	dfs(0,0,0);
	cout<<ma;
	return 0;	
}

错的点

用贪心写还策略想错了,以后做贪心要多想想

T3 饮料难题

思路

能喝几瓶饮料呢? k空瓶=1饮料+1空瓶 k-1空瓶=1饮料 所以能喝n/(k1)n/(k-1)瓶饮料,要用高精度,记得开longlonglong long

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;

vector<int> add(vector<int>a,int k){
	int y=0;
	vector<int>s;
	for(int i=0;i<a.size();i++){
		int sz=y*10+a[i];
		s.push_back(sz/k);
		y=sz%k;
	}
	return s;
}
signed main(){
	freopen("drink.in","r",stdin);
	freopen("drink.out","w",stdout);
	vector<int>n;
	int k;
	string ss;
	cin>>ss>>k;
	for(int i=0;i<ss.size();i++)n.push_back(ss[i]-'0');
	k--;
	vector<int>s=add(n,k);
	int j=0;
	while(s[j]==0&&j<s.size()-1)j++;

	for(int i=j;i<s.size();i++)cout<<s[i];
	return 0;	
}

错的点

不开longlonglong long见祖宗,以后要开long longlong\ long

T4