A . P e r f e c t P e r m u t a t i o n A.Perfect\ Permutation A.Perfect Permutation
题意: 一个排列的值定义为:
i
m
o
d
p
i
=
0
i \mod p_i=0
imodpi=0的个数。给定排列大小,求最小的排列。
题解: 只需将相邻两个数调换一下位置,
n
n
n为奇数的时候特殊处理一下后三个即可
#include<bits/stdc++.h>
using namespace std;
const int N=100100;
int T,n,a[N];
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&n);
if(n==1) a[1]=1;
else{
for(int i=1;i<n;i+=2) a[i]=i+1,a[i+1]=i;
if(n&1) a[n]=n-1,a[n-1]=n-2,a[n-2]=n;
else a[n-1]=n,a[n]=n-1;
}
for(int i=1;i<=n;i++) printf("%d ",a[i]);
puts("");
}
}
B . P a r t y B. Party B.Party
题意:
n
n
n个人参加派对,不邀请第
i
i
i个人则会产生
a
i
a_i
ai的不满意值。有
m
m
m对组合,组合两人都被邀请的话需要提供一个蛋糕。现要求需要的蛋糕数为偶数的前提下最小化不满意值。
n
≤
1
0
5
n\leq10^5
n≤105
0
≤
a
i
≤
1
0
4
\ \ \ 0\leq a_i\leq10^4
0≤ai≤104
题解: 如果
m
m
m是偶数,直接全部人都邀请,
a
n
s
=
0
ans=0
ans=0;
m
m
m是奇数,把
m
m
m对组合看成边计算每个点的度数。发现答案只有两种情况:删除一个奇数点;删除均为偶数点的一对关系。两种情况取最小即可。
#include<bits/stdc++.h>
using namespace std;
const int N=100100;
struct node{
int u,v;
}h[N];
int T,n,m,ans,a[N],cnt[N];
int main()
{
scanf("%d",&T);
while(T--){
for(int i=1;i<=n;i++) cnt[i]=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++){
scanf("%d%d",&h[i].u,&h[i].v);
cnt[h[i].u]++;
cnt[h[i].v]++;
}
if(m&1){
ans=1e9;
for(int i=1;i<=n;i++){
if(cnt[i]&1) ans=min(ans,a[i]);
}
for(int i=1;i<=m;i++){
if(cnt[h[i].u]%2==0&&cnt[h[i].v]%2==0){
ans=min(ans,a[h[i].u]+a[h[i].v]);
}
}
}
else ans=0;
printf("%d\n",ans);
}
}
C . C o l o r t h e P i c t u r e C. Color\ the\ Picture C.Color the Picture
题意:
n
∗
m
n*m
n∗m的格子图,有
k
k
k种颜色,每种颜色最多可以涂
a
i
a_i
ai个格子。定义图片是美观的:每个格子相邻的格子中有至少三个与本格子颜色相同。定义格子相邻为
x
1
−
x
2
≡
±
1
(
m
o
d
n
)
x_1 - x_2\equiv\pm1(mod\ n)
x1−x2≡±1(mod n)且
y
1
=
=
y
2
y_1==y_2
y1==y2,或
y
1
−
y
2
≡
±
1
(
m
o
d
m
)
y_1 - y_2\equiv\pm1(mod\ m)
y1−y2≡±1(mod m)且
x
1
=
=
x
2
x_1==x_2
x1==x2。判断该图是否是美观的。
3
≤
n
,
m
≤
1
0
9
3\leq n,m\leq10^9
3≤n,m≤109
1
≤
k
≤
1
0
5
\ \ \ 1\leq k\leq10^5
1≤k≤105
1
≤
a
i
≤
1
0
9
\ \ \ 1\leq a_i\leq10^9
1≤ai≤109
题解: 由样例可知,如果要美观必定要至少
2
2
2行(列)相同颜色相邻。若m(n)为奇数,则至少需要一个颜色能提供大于
3
3
3行(列)的相同颜色。主要开
l
o
n
g
l
o
n
g
long\ long
long long
#include<bits/stdc++.h>
using namespace std;
const int N=100100;
int T,n,m,k,a[N];
bool cmp(int a,int b){return a>b;}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++) scanf("%d",&a[i]);
long long cnt=0;
bool flag=0;
for(int i=1;i<=k;i++){
if(a[i]/m>=2) cnt+=a[i]/m;
if(a[i]/m>2) flag=1;
}
if(cnt>=n){
if(n%2==0||(n%2==1&&flag)){
printf("Yes\n");
continue;
}
}
cnt=0;flag=0;
for(int i=1;i<=k;i++){
if(a[i]/n>=2) cnt+=a[i]/n;
if(a[i]/n>2) flag=1;
}
if(cnt>=m){
if(m%2==0||(m%2==1&&flag)){
printf("Yes\n");
continue;
}
}
printf("No\n");
}
}