Educational Codeforces Round 104 (Rated for Div. 2)
Educational Codeforces Round 104 (Rated for Div. 2)
https://codeforces.ml/contest/1487
A. Arena
思路
题意为给出一些英雄的等级序列,每两个英雄之间可以进行对决,等级大的一个英雄的等级会加1,当英雄赢的场数大于等于100500时胜出,求出最大的胜出英雄数。
因为只有等级高的英雄才可以赢得对决从而胜出,而等级最低的英雄永远无法胜出,所以只需要求出除去最小等级后的英雄数。
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N= 1e5+7;
const ll mod=998244353;
int a[107];
int main(){
IO;
int t=1;
cin>>t;
while(t--){
int n;
cin>>n;
for (int i = 0; i < n; ++i)
{
cin>>a[i];
} sort(a,a+n);
int ans=0;
for (int i = 0; i < n; ++i)
{
if(a[i]!=a[0])ans++;
}cout<<ans<<endl;
}
return 0;
}
B. Cat Cycle
思路
题意为有两种猫A和B,他们都有相同的n个睡觉点,由序列1、2、3、…… 、n-1、n
组成,其中A的睡觉点从n开始倒序循环移动,B的睡觉点从1开始循环移动,当某一时刻A和B要同时到达同一个睡觉点时,A会进入此点而B会跳过此点进入它序列中的下一个点。询问k时刻时B所在位置。
- 考虑A和B没有冲突的情况,此时n为偶数,答案即为
k%n+(k%n==0)*n
。(考虑到k是n的倍数的情况) - 当n为奇数时,它们发生冲突的次数即使B多走的次数,而每过
n/2
时刻它们就会发生冲突(要除去第1个时刻的情况,因为第1个时刻它们位于出发点),此时B走的时刻数就是k加上多走的次数。
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N= 1e5+7;
const ll mod=998244353;
int main(){
IO;
int t=1;
cin>>t;
while(t--){
ll n,k;
cin>>n>>k;
if(n%2==0){
cout<<(k%n+(k%n==0?n:0))<<endl;
}
else{
ll p=(n+1)/2;
p=(k>=p)+(k>=p)*(k-p)/(p-1);
k+=p;
cout<<(k%n+(k%n==0?n:0))<<endl;
}
}
return 0;
}
C. Minimum Ties
思路
题意为所有队伍得分相同并且保证平局数最少。
- 当n为奇数时,平局数为0,可以让每个队伍的胜场数均为
(n-1)/2
- 当n为偶数时,此时在奇数情况的基础上再加上一场平居即可。
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N= 1e5+7;
const ll mod=998244353;
int a[107][107];
int main(){
IO;
int t=1;
cin>>t;
while(t--){
int n;
cin>>n;
if(n==2)cout<<0<<endl;
else if(n%2==1){
int k=(n-1)/2;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= k; ++j)
{
a[i][(i+j)%n+((i+j)%n==0)*n]=1;
a[(i+j)%n+((i+j)%n==0)*n][i]=-1;
}
}
for (int i = 1; i <= n; ++i)
{
for (int j = 1+i; j <= n; ++j)
{
if(i==j)continue;
cout<<a[i][j]<<" ";
}
}cout<<endl;
}
else{
int k=(n-1)/2;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= k; ++j)
{
a[i][(i+j)%n+((i+j)%n==0)*n]=1;
a[(i+j)%n+((i+j)%n==0)*n][i]=-1;
}
a[i][(i+k)%n+((i+k)%n==0)*n+1]=0;
a[(i+k)%n+((i+k)%n==0)*n+1][i]=0;
}
for (int i = 1; i <= n; ++i)
{
for (int j = i+1; j <= n; ++j)
{
cout<<a[i][j]<<" ";
}
}cout<<endl;
}
}
return 0;
}
D. Pythagorean Triples
思路
一开始没看懂,瞎琢磨了半天,后来发现这题巨简单
题意为给出n求出满足条件的三元组(a,b,c)
的个数,其中 a<=b<=c,c=a2-b,a2+b2=c2。
两个等式消去c得到: b=(a2-1)/2,c=(a2+1)/2,并且因为a<=b<=c,所以得出 (a2+1)/2<=n ,而 b=(a2-1)/2>=a 得出 a>=3,所以得到了a的取值,直接在此区间搜索判断是否满足条件即可。
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N= 1e5+7;
const ll mod=998244353;
int main(){
IO;
int t=1;
cin>>t;
while(t--){
ll n;
cin>>n;
ll ans=0;
for (int i = 3; i <= n; ++i)
{
if((i*i+1)/2>n)break;
if((i*i-1)%2==0&&(i*i+1)%2==0)ans++;
}cout<<ans<<endl;
}
return 0;
}
Code will change the world !