- 阳子墨 的博客
国庆集训 DAY2
- @ 2024-10-3 18:52:28
T1神秘金币
正确思路
因为拾取每一个金币只需要一个时刻,而每一个金币的消失时间都是不一样的.那么我们理论上可以拿到所有金币。所以价值和最大是前k大的金币和
正确代码
#include<bits/stdc++.h>
using namespace std;
long long n,a[100010],tim[100010],sum,k;
int main()
{
freopen("coin.in","r",stdin);
freopen("coin.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>tim[i];
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=n;i>n-k;i--)
{
sum+=a[i];
}
cout<<sum;
return 0;
}
T2学习乘法
正确思路
可以用暴搜,枚举出所有可能性,在找到最大值
时间复杂度
正确代码
#include<bits/stdc++.h>
using namespace std;
long long as[20],bs[20],idx1,idx2,a1,b1,maxx;
void dfs(int u)
{
if(u==0)
{
a1=0;
b1=0;
for(int i=idx1;i>=1;i--) a1=a1*10+as[i];
for(int i=idx2;i>=1;i--) b1=b1*10+bs[i];
maxx=max(maxx,a1*b1);
return;
}
for(int i=0;i<2;i++)
{
if(i==1)
{
swap(as[u],bs[u]);
dfs(u-1);
swap(as[u],bs[u]);
}
else
{
dfs(u-1);
}
}
return;
}
int main()
{
freopen("mul.in","r",stdin);
freopen("mul.out","w",stdout);
int a,b;
cin>>a>>b;
while(a)
{
as[++idx1]=a%10;
a/=10;
}
while(b)
{
bs[++idx2]=b%10;
b/=10;
}
dfs(idx1);
cout<<maxx;
return 0;
}
T3饮料难题
思路
k个空瓶=1个饮料+1个空瓶
k-1个空瓶=1个饮料
结果就是
需要高精度
正确代码
#include<bits/stdc++.h>
using namespace std;
string a;
vector<int> sum,A;
long long k;
vector<int> div(vector<int> d,int b)
{
vector<int> C;
int t=0;
int r=0;
for(int i=d.size()-1;i>=0;i--)
{
t=r*10+d[i];
r=t%b;
C.push_back(t/b);
}
reverse(C.begin(),C.end());
while(C.back()==0&&C.size()>1) C.pop_back();
reverse(C.begin(),C.end());
return C;
}
int main()
{
freopen("drink.in","r",stdin);
freopen("drink.out","w",stdout);
cin>>a>>k;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
sum=div(A,k-1);
for(int i=0;i<sum.size();i++) cout<<sum[i];
return 0;
}
T4手术
暂无(set写不了一点)