A 看出来的题目(最大和最小)
记得开LL 就行
#include <bits/stdc++.h>
using namespace std;
int t,n,x;
const int N =1e5+10;
int a[N];
typedef long long ll;
int main()
{
cin>>t;
while(t -- )
{
scanf("%d%d",&n,&x);
ll ans =0 ;
ll sum = 0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]%x>0) ans+=(a[i]/x +1);
else ans+=a[i]/x;
sum+=a[i];
}
if(sum%x>0)
cout<<sum/x+1<<" "<<ans<<endl;
else
cout<<sum/x<<" "<<ans<<endl;
sum = 0;
ans = 0;
}
return 0;
}
B.机器人玩数组
题目大意:
给定一个数组 然后在给定一个x
从头开始遍历数组
如果遍历到可以被x整除的数那么需要给数组在后面
添加x个 ai/x 否则则停止遍历
问最后整个数组的sum
数据范围很大 ,不管用数组直接加还是用vector都爆了
(问就是wa了好多次)
仔细考虑 发现增加的数字的总和等于数字本身所以 我们只需要用b[]来存
数据本身,那么每次用a[]来判断是否还能被x整除就行
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
int main()
{
int t;
cin >> t;
while (t--)
{
ll n, x, i, j, k = 1;
cin >> n >> x;
ll a[n], sum = 0, b[n];
for (i = 0; i < n; i++)
{
cin >> a[i];
b[i] = a[i];
sum += a[i];
}
while (k)
{
for (i = 0; i < n; i++)
{
if (a[i] % x == 0)
{
sum += b[i];
a[i] /= x;
}
else
{
k = 0;
break;
}
}
}
cout << sum << endl;
}
}
C.购买礼物
一开始以为是背包问题
但是最后发现只是贪心而已
排序一下之后直接 求和就行
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+5;
int n,m;
int i,j,k;
ll a[N];
ll c[N];
int main()
{
int t;
cin>>t;
while(t -- )
{
cin>>n>>m;
for(int i=1; i<=n; i++)
cin>>a[i];
for(int i=1; i<=m; i++)
cin>>c[i];
sort(a+1,a+1+n);
ll ans=0,cur=1;
for(int i=n; i; i--)
{
if(cur>a[i]) ans+=c[a[i]];
else ans+=c[cur++];
}
cout<<ans<<endl;
}
return 0;
}