C - Arena
题解:比赛可以进行100^500次,换句话说就是 第 i 名只要可以打赢一个人,就可以一直跟他打,所以结论也很明显:有比 a[ i ] 小的数,第i个人就能赢
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int a[N];
void Test(){
int n;
cin>>n;
int res=0x3f3f3f3f;
for(int i=1;i<=n;i++){
cin>>a[i];
res=min(a[i],res);
}
int cnt=0;
for(int i=1;i<=n;i++)
if(a[i]!=res) cnt++;
cout<<cnt<<"\n";
}
int main(){
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
Test();
}
E - Minimum Ties
题解:如果人数 n 是奇数,就代表每个人都要进行偶数场比赛,可以一半比赛赢,一半比赛输,既保证了得分相同,又没有平局;如果 n 是偶数,每个人就要进行奇数场比赛,如果想要得分相同,每个人就必须有一场是平局。如果能发现这个规律,模拟起来就非常简单了。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--) {
int n;
cin>>n;
if(n%2) {
for(int i=1; i<n; i++) {
int flag=1;
for(int j=i+1; j<=n; j++) {
cout<<flag<<" ";
flag*=-1;
}
}
} else {
for(int i=1; i<=n/2; i++) {
cout<<"0 ";
int flag=1;
for(int j=1; j<=n*2-i*4; j++) {
cout<<flag<<" ";
flag*=-1;
if(j==(n-i*2)) flag*=-1;
}
}
}
cout<<"\n";
}
}
F - Cat Cycle
题解:首先看到 n k的范围是1e9,就能直接排除暴力,可以发现:
如果 n 是偶数,两只猫就会各走各的,不会有重合的情况,答案就是 k%n ,要处理一下k%n==0的情况,这个时候答案是n;
如果n是奇数,b猫就会每隔 n/2 步就会多走一步,所以就要判断出k步中有多少个(n/2),这里有一个特殊情况当k%(n/2)==0时,这个时候他实际多走了 k/(n/2)-1 步(手动模拟一下),其他情况就是 k/(n/2);
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--){
ll n,k;
cin>>n>>k;
if(k<=n/2) cout<<k<<endl;
else if(n%2==0) cout<<(k%n==0?n:k%n)<<"\n";
else{
ll x=n/2;
if(k%x==0) k+=k/x-1;
else k+=k/x;
cout<<(k%n==0?n:k%n)<<"\n";
}
}
}