1003 Simple Set Problem
题意:
给出k个数组,从每个数组中选出一个数组成新的数组 a a a, d = m a x ( a 1 , a 2 , . . . . . a k ) − m i n ( a 1 , a 2 , . . . . . a k ) d=max(a_{1},a_{2},.....a_{k})-min(a_{1},a_{2},.....a_{k}) d=max(a1,a2,.....ak)−min(a1,a2,.....ak),求d的最小值。
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
void solve()
{
int tt; cin >> tt;
vector<vector<int>> S(tt);
for(int i = 0;i < tt;i ++)
{
int n; cin >> n;
int x;
for(int j = 0;j < n;j ++)
{
cin >> x;
S[i].push_back(x);
}
}
for(int i = 0;i < tt;i ++)
{
sort(S[i].begin(),S[i].end());
}
vector<int> a(tt,0);
vector<int> p(tt,0);
for(int i = 0;i < tt;i ++)
{
a[i] = S[i][0];
}
int ans = *max_element(a.begin(),a.end()) - *min_element(a.begin(),a.end());
while(1)
{
int index = min_element(a.begin(),a.end()) - a.begin();
p[index] ++;
if(p[index] >= S[index].size()) break;
a[index] = S[index][p[index]];
ans = min(ans,*max_element(a.begin(),a.end()) - *min_element(a.begin(),a.end()));
}
cout << ans << '\n';
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int tttt; cin >> tttt;
while(tttt --)
{
solve();
}
return 0;
}
1006 PSO
题意:
给定一个星状图(中心节点与每个其他节点之间各有一条边,其他节点之间没有边),任选两个点,求它们之间的距离的数学期望以及最大距离的长度。
题解:
当
n
=
2
n=2
n=2时,只能形成一条边所以期望值和最大值都为1.
当
n
>
2
n>2
n>2时,可形成
(
n
−
1
)
(n-1)
(n−1)条长度为1的边,和
C
n
−
1
2
C_{n-1}^2
Cn−12条长度为2的边,最大值为2.
期望值
=
2
∗
C
n
−
1
2
+
(
n
−
1
)
C
n
−
1
2
+
(
n
−
1
)
期望值=\cfrac{2*C_{n-1}^2+(n-1)}{C_{n-1}^2+(n-1)}
期望值=Cn−12+(n−1)2∗Cn−12+(n−1)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long
using namespace std;
void solve()
{
int n;
cin>>n;
double z=pow(n-1,2);
double m=(n-1)+(n-1)*(n-2)/2;
printf("%.9f ",z/m);
if(n<=2) cout<<"1.000000000"<<endl;
else cout<<"2.000000000"<<endl;
}
signed main()
{
int T;
cin>>T;
while(T--)
{
solve();
}
return 0;
}
1010 Kong Ming Qi
题意:
如题,游戏规则和孔明棋相似
在一个
(
n
+
2
)
×
(
m
+
2
)
(
n
+
2
)
( n + 2 ) × ( m + 2 ) (n+2)
(n+2)×(m+2)(n+2)大小的棋盘的中间
n
×
m
n × m
n×m 的格子里放置着一些棋子
每次行动可以选择一个有四面相邻的棋子,使其跳过相邻的棋子,并使被跳过的棋子从棋盘上被移除
问对于给定的
n
,
m
n,m
n,m剩余棋子个数最少是多少。
题解:
对于
1
∗
n
1*n
1∗n的图形可以变为
n
2
\cfrac{n}{2}
2n个棋子。
对于
1
∗
3
1*3
1∗3的图形可以变成
1
1
1个棋子。
对于
2
∗
3
2*3
2∗3的图形也可以变成
1
1
1个棋子。
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
void solve()
{
int m,n;
cin>>m>>n;
if(n>m) swap(m,n);
if(n==1) cout<<(m+1)/2 << endl;
else if(!(n%3&&m%3)) cout<<2<<endl;
else cout<<1<<endl;
}
signed main()
{
int T;
cin>>T;
while(T--)
{
solve();
}
return 0;
}
1012 a-b Problem
题意:
两人轮流捡石头,爱丽丝先选,每个石头有两个属性 A i A_{i} Ai和 B i B_{i} Bi,当爱丽丝捡到会获得积分 A i A_{i} Ai,鲍勃捡到会获得积分 B i B_{i} Bi,两人都想让自己的积分减去对方的差值最大。
题解:
无论谁捡到第 i i i块石头,对自己的贡献都相当于 A i + B i A_{i}+B_{i} Ai+Bi
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
const int N=1e5+10;
PII a[N];
int main()
{
int T;
cin>>T;
while(T--)
{
int sum1=0;
int sum2=0;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x,y;
cin>>x>>y;
a[i].first=x+y;
a[i].second=y;
}
sort(a,a+n);
for(int i=0;i<n;i++)
{
if(i%2==0) sum1+=a[i].first-a[i].second;
else sum2=a[i].second;
}
cout<<sum1-sum2<<endl;
}
return 0;
}