T1T1

考试错误:在考试时想到了先拿价值高的,但是没有想到可以交换拿的顺序 (qwq)(\operatorname{q}w\operatorname{q})

思路:

由于题目中的 tit_i 互不相同,所以可以直接按时间顺序拿价值前 kk 大的金币,总的来说就是一道求 nn 个数中前 kk 大的数的和。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+50;
struct PII{
	int t;
	int u;
	bool operator<(const PII& T) const{
		return u>T.u;
	}
}a[N];
signed main(){
    freopen("coin.in","r",stdin);
    freopen("coin.out","w",stdout);
	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].u;
	sort(a+1,a+n+1);
	int ans=0;
	for(int i=1;i<=k;i++){
		ans+=a[i].u;
	}
	cout << ans;
}

T2T2

考试错误:无。

思路:

没啥可讲的,直接暴力深搜即可。

代码:

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

T3T3

考试错误:无。

思路:

一道高精度模版题。答案为 n÷(k1)n \div (k-1)。证明如下:

kk 个瓶子 == 11 瓶饮料 == 11 个瓶子 + 11 瓶的饮料

(k1)(k-1) 个瓶子 == 11 瓶的饮料

nn 个瓶子 == n÷(k1)n \div (k-1) 瓶的饮料

证毕。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<int> div(vector<int> &A,int b){
	vector<int> C;
	int t=0,r=0;
	for(int i=A.size()-1;i>=0;i--){
		t=r*10+A[i];
		C.push_back(t/b);
		r=t%b;
	}
	reverse(C.begin(),C.end());
	while(C.back()==0&&C.size()>1){
		C.pop_back();
	}
	return C;
}
signed main(){
	freopen("drink.in","r",stdin);
	freopen("drink.out","w",stdout);
    string n;
    int k;
    cin >> n >> k;
    vector<int> A;
    for(int i=n.size()-1;i>=0;i--){
    	A.push_back(n[i]-'0');
	}
    k--;
    vector<int> C=div(A,k);
    for(int i=C.size()-1;i>=0;i--){
    	cout << C[i];
	}
}