Educational Codeforces Round 141 (Rated for Div. 2)
比赛链接:https://codeforces.com/contest/1783
A. Make it Beautiful
题目大意:对数组a进行排序,使满足∀i,a[i] != s[i - 1],(1 <= i <= n)
思路:全部元素相同则无解,否则进行逆序排列,若第一个与第二个相等,则将第二个与最后一个进行交换
void solve()
{
cin >> n;
for(int i = 1; i <= n; i ++ )
cin >> a[i];
sort(a + 1, a + n + 1);
if(a[1] == a[n]) cout << "NO" << endl;
else
{
cout << "YES" << endl;
if(a[n] == a[n - 1]) swap(a[n - 1], a[1]);
for(int i = n; i >= 1; i -- )
cout << a[i] << " ";
cout << endl;
}
}
B. Matrix of Differences
题目大意:给定一个矩阵,定义一个集合包含相邻的两个元素相减的绝对值,将1~n放入矩阵中,使得集合去重后中的包含的元素最多
思路:按照1,n²-1,2, n²-2,3,n²-3,4…的顺序排列下去可以保证凑出1~n²-1,横(竖)顺序填入即可
void dfs(int i, int j, int flag)
{
if(flag) a[i][j] = x ++ ;
else a[i][j] = y -- ;
for(int d = 0; d < 4; d ++ )
{
int ax = i + dx[d];
int ay = j + dy[d];
if(ax < 1 || ax > n || ay < 1 || ay > n || a[ax][ay]) continue;
dfs(ax, ay, !flag);
break;
}
}
void solve()
{
memset(a, 0, sizeof a);
cin >> n;
x = 1, y = n * n;
dfs(1, 1, 1);
for(int i = 1; i <= n; i ++ )
{
for(int j = 1; j <= n; j ++ )
cout << a[i][j] << " ";
cout << endl;
}
for(auto it : p) cout << it << endl;
}
C. Yet Another Tournament
题目大意:给定1~n个对手,m分钟的时间,击败一个对手需要v[i]分钟,否则会被击败, 1~n个对手两两之间比赛一次,i>j时i获胜,按照击败人数排序,求最高名次
思路:击杀x人时,未击杀第x+1名对手则排名为n + 1 - x,否则排名为n - x,考虑在击杀最多的情况下尽量击杀第x+1名对手
void solve()
{
memset(st, 0, sizeof st);
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i ++ )
{
scanf("%d", &v[i]);
a[i] = {v[i], i};
}
sort(a + 1, a + n + 1);
int ans = 0, max_v = 0;
for(int i = 1; i <= n; i ++ )
if(m - a[i].x >= 0)
{
ans ++ ;
m -= a[i].x;
max_v = max(max_v, a[i].x);
st[a[i].i] = 1;
}
if(ans != n)
{
if(st[ans + 1]) ans ++ ;
else if(m + max_v - v[ans + 1] >= 0) ans ++ ;
}
printf("%d\n", n + 1 - ans);
}