E. Spicy or Grilled?
这题我当时都没看题,队友说很简单能过,我还怀疑他来着。要相信队友!
就是一个很简单的运算题啊。
#include<bits/stdc++.h>
using ll=long long;
const int N=2e5+10;
void solve()
{
ll n,x,a,b;
std::cin>>n>>x>>a>>b;
std::cout<<(n-x)*a+b*x<<'\n';
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t=1;
std::cin>>t;
while(t--)
{
solve();
}
return 0;
}
A. Long Live
题意:
给定x和y,求解使得a*b最大的a,b,输出a,b即可。
思路:
当时推结论挺快的,没开ll浪费了20min。
想要a*b最大,b在根号里面,所以a为1的时候a*b最大。然后然后化简一下式子,
把a=1代入即可。
#include<bits/stdc++.h>
using ll=long long;
const int N=2e5+10;
void solve()
{
ll x,y;
std::cin>>x>>y;
std::cout<<1<<" "<<x/std::__gcd(x,y)*(y/std::__gcd(x,y))<<'\n';
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t=1;
std::cin>>t;
while(t--)
{
solve();
}
return 0;
}
J. Points on the Number Axis A
题意:
有n个点,每次可以选择一对点删去,然后加上这两个点的中点,求解最后的点的期望。
思路:
因为选每对点的可能都是相同的,所以答案就是所有点的平均数。
#include<bits/stdc++.h>
using ll=long long;
using LL=long long;
#define int ll
const int N=1e6+10;
const int mod=998244353;
int a[N];
LL qmi(int a,int k,int p)
{
LL res=1;
while(k)
{
if(k&1) res=(LL)res*a%p;
k>>=1;
a=(LL)a*a%p;
}
return res;
}
void solve()
{
int n;
std::cin>>n;
ll s=0;
for(int i=1;i<=n;i++)
{
std::cin>>a[i];
s=(s+a[i])%mod;
}
std::cout<<(ll)s*qmi(n,mod-2,mod)%mod;
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t=1;
//std::cin>>t;
while(t--)
{
solve();
}
return 0;
}
L. LCMs
题意:
给定a,b两个点,定义两点之间距离为lcm(a,b)。求解最短路。
思路:
模拟一下会发现,使得路径最短的能经过的点只能是2,a的最小因数,b的最小因数,ab最大公约数,注意要特判一下1。然后这几个点存进数组里,跑一遍floyd即可。
#include<bits/stdc++.h>
using ll=long long;
using LL=long long;
#define int ll
const int N=110;
const int mod=998244353;
int c[N];
int k=0;
int g[N][N];
ll lcm(ll a,ll b)
{
return (ll)a/std::__gcd(a,b)*b;
}
void floyd()
{
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
{
if(i==j) g[i][j]=0;
else g[i][j]=lcm(c[i],c[j]);
}
}
for(int p=1;p<=k;p++)
{
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
{
g[i][j]=std::min(g[i][j],g[i][p]+g[p][j]);
}
}
}
}
void solve()
{
memset(c,0,sizeof c);
k=0;
int a,b;
std::cin>>a>>b;
c[++k]=a,c[++k]=b,c[++k]=2;
if(std::__gcd(a,b)!=1)
{
c[++k]=std::__gcd(a,b);
}
for(int i=2;i*i<=a;i++)
{
if(a%i==0)
{
c[++k]=i;
break;
}
}
for(int i=2;i*i<=b;i++)
{
if(b%i==0)
{
c[++k]=i;
break;
}
}
std::sort(c+1,c+1+k);
k=std::unique(c+1,c+1+k)-c-1;
int aa=0;
for(int i=1;i<=k;i++)
{
//std::cout<<c[i]<<" ";
if(c[i]==a)
{
aa=i;
break;
}
}
//std::cout<<'\n';
floyd();
std::cout<<g[aa][k]<<'\n';
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t=1;
std::cin>>t;
while(t--)
{
solve();
}
return 0;
}
B. Nana Likes Polygons
题意:
给n个点,求出从中选出3个点能组成的三角形最小面积。
思路:
枚举点然后计算面积即可。
放个队友的代码。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
//(1/2)*[(x2y3-x3y2)-(x1y3-x3y1)+(x1y2-x2y1)]
void solve()
{
int n;
double ans = 1e18;
cin >> n;
vector<pair<int, int> > s(n+1);
for (int i = 0; i < n; i++)
cin >> s[i].first >> s[i].second;
if(n<=2){
cout<<"-1"<<endl;
return;
}
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
for (int z = j + 1; z < n; z++)
{
double t= fabs((s[j].first * s[z].second - s[z].first * s[j].second) -
(s[i].first * s[z].second- s[z].first * s[i].second) +
(s[i].first * s[j].second - s[j].first * s[i].second) );
if(t!=0)
ans = min(ans, t / 2.0);
}
}
}
if (ans==1e18) {
cout << "-1" << endl;
return;
}
printf("%.8f\n",ans);
}
int main()
{
int t;
cin >> t;
while (t--)
solve();
}