A. Arena (*800)
题意
有(n(2leq nleq 100))个人,每人初始有一个能力值(a_i),每次可以随意选择两个人进行一场比赛,能力值高的人能力值加一,当一个人至少赢了(100^{500})场比赛时,他就是冠军,计算可能成为冠军的人数
题解
对于能力值为(a_i)的人,如果没有人能力值比他小,那么他无法赢得任何比赛,所以无法成为冠军。反之,只要有任何一个人的能力值比他小,他就可以不断和这个人进行比赛,从而成为冠军。所以答案为总人数减去(a_i)最小的人数
#include<bits/stdc++.h>
#define LL long long
#define PII pair<int,int>
#define eps 1e-6
#define lowbit(x) x&(-x)
using namespace std;
const int maxn=110;
int T,n,a[maxn];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+1+n);
int ans=(a+1+n)-upper_bound(a+1,a+1+n,a[1]);
printf("%d
",ans);
}
}
B. Cat Cycle (*1200)
题意
有两只猫(A)和(B)和(n(2leq nleq 1e9))块它们睡觉所在的毛绒布,这两只猫每小时都会更换睡觉所在地,循环更换:
对于(A),循环顺序为(n,n-1,,n-2,cdots ,3,2,1,n,n-1,cdots)
对于(B),循环顺序为(1,2,3,cdots ,n-1,n,1,2,cdots)
由于(A)更年长,所以当(A)和(B)刚好要睡同一块毛绒布时,(A)睡这块毛绒布,(B)睡它的顺序里的下一块毛绒布
给出小时数(k(1leq kleq 1e9)),计算经过(k)个小时之后(B)位于的毛绒布编号
题解
如果(n)是偶数,则(A)和(B)不会在同一块毛绒布上相遇,可以通过(k\% n)计算(B)的位置
如果(n)是奇数,则每经过(lfloor frac{2}{n}
floor)步,(B)就会比(A)多走(1)步,可以通过((k+lfloor frac{2}{n}
floor)\% n)计算(B)的位置
#include<bits/stdc++.h>
#define LL long long
#define PII pair<int,int>
#define eps 1e-6
#define lowbit(x) x&(-x)
using namespace std;
int T;
LL n,k;
int main(){
scanf("%d",&T);
while(T--){
scanf("%lld %lld",&n,&k);
k--;
if(n%2==0){
printf("%lld
",k%n+1);
}
else{
LL f=n/2;
k+=k/f;
printf("%lld
",k%n+1);
}
}
}
C. Minimum Ties (*1500)
题意
有(n(2leq nleq 100))支队伍,两两之间进行一场比赛,一共进行(frac{n(n-1)}{2})场比赛。胜者得(3)分,败者得(0)分,平局双方各得(1)分。构造一种每局的胜败情况,使得所有比赛结束之后所有队伍的分数相同并且平局数量最少
题解
case 1: (n)为奇数。每支队伍需要进行((n-1))场比赛,((n-1))为偶数,所以只要每支队伍胜(frac{(n-1)}{2})场,负(frac{(n-1)}{2})场,则不需要平局。具体构造方法是将所有队伍按照编号围成一个圆圈,每支队伍与之后(frac{(n-1)}{2})支队伍的比赛结果为胜,与再之后(frac{(n-1)}{2})支队伍的比赛结果为负
case 2: (n)为偶数。如果所有(frac{n(n-1)}{2})场比赛全都不是平局,则总得分为(frac{3n(n-1)}{2}),无法整除(n),所以需要平局,平局数量最少为(frac{n}{2})。具体构造方法是将所有队伍按照编号围成一个圆圈,每支队伍与之后(frac{(n-2)}{2})支队伍的比赛结果为胜,与之后第(frac{n}{2})支队伍的比赛结果为平局,与再之后(frac{n(n-2)}{2})支队伍的比赛结果为负
#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define PII pair<int,int>
#define PLL pair<LL,LL>
#define PLI pair<LL,int>
#define pi acos(-1.0)
#define eps 1e-6
#define lowbit(x) x&(-x)
using namespace std;
int T,n;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
if(n&1){
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(j-i<=n/2) printf("1");
else printf("-1");
if(i==n-1 && j==n) printf("
");
else printf(" ");
}
}
}
else{
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(j-i<n/2) printf("1");
else if(j-i==n/2) printf("0");
else printf("-1");
if(i==n-1 && j==n) printf("
");
else printf(" ");
}
}
}
}
}
D
题意
给出(n(1leq nleq 1e9)),计算有多少组((a,b,c))满足
(
left{
egin{matrix}
1leq aleq bleq cleq n\
c^2=a^2+b^2\
c=a^2-b\
end{matrix}
ight.
)
题解
将(a^2)代换,得到(b^2+b=c^2-c),即为(b(b+1)=c(c-1)),也就是(c=b+1),所以(2leq cleq n)。将(b=c-1)代入(a^2=b+c),得到(a^2=2c-1),所以(a)为奇数,由于(aapprox sqrt{c} leq sqrt{n}),所以可以枚举(a),时间复杂度(O(sqrt{n}))。也可以直接推出式子得到答案:(ans=frac{sqrt{2n-1}+1}{2}-1),时间复杂度(O(1))
(O(sqrt{n}))
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int T;
LL n;
int main(){
scanf("%d",&T);
while(T--){
scanf("%lld",&n);
LL ans=0;
for(LL i=3;i*i<=2*n-1;i+=2) ans++;
printf("%lld
",ans);
}
}
(O(1))
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int T;
LL n;
int main(){
scanf("%d",&T);
while(T--){
scanf("%lld",&n);
LL ans=(sqrt(2*n-1)+1)/2-1;
printf("%lld
",ans);
}
}