A. Arena
#include<bits/stdc++.h>
using namespace std;
int a[110];
int main()
{
int t, n, i;
scanf("%d", &t);
while (t--){
int mi = 110;
scanf("%d", &n);
for (i = 1; i <= n; i++){
scanf("%d", &a[i]);
mi = min(mi, a[i]);
}
int res = 0;
for (i = 1; i <= n; i++)
if (a[i] > mi) res++;
printf("%d\n", res);
}
}
B. Cat Cycle
题解:n为偶数,没有重合,直接取模;n为奇数,从第n/2项(向上取整)开始,每过n/2项(向下取整)步数加一,注意取模。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t, n, k;
scanf("%d", &t);
while (t--){
scanf("%d%d", &n, &k);
if (n % 2 == 0){
if (k <= n) printf("%d\n", k);
else if (k % n) printf("%d\n", k % n);
else printf("%d\n", n);
continue;
}
if (k < (n + 1 ) / 2) printf("%d\n", k);
else if (k < n) printf("%d\n", k + 1);
else{
int add = 1 + (k - (n + 1) / 2) / (n / 2);
int num = k % n;
if (!num) num = n;
if ((num + add) % n) printf("%d\n", (num + add) % n);
else printf("%d\n", n);
}
}
}
C. Minimum Ties
题意:有n支队伍,每两支队伍比赛一次,平局双方各加一分,赢的加三分,输的不加分。问最少平局几次使得每支队伍的分数相同。
题解:将每场比赛看成一条边,每支队伍看成一个点。平局双方都能加一分,可以看作没有加分,即这条边当作不存在。如果有输赢,那么边指向的点赢,指出去的点输。题目要求每支队伍的分数相同,也就是指向每个点的边数相同。当有奇数个点时,每个点有偶数条边与之相连,一半指进一半指出即可;偶数个点有奇数条边相连,去掉一条边,再对半分即可。
#include<bits/stdc++.h>
using namespace std;
int a[110];//差值为i的边的方向
int main()
{
int t, n, i, j;
scanf("%d", &t);
while (t--){
scanf("%d", &n);
if (n % 2){
for (i = 1; i <= n / 2; i++)
a[i] = 1;
for (i = n / 2 + 1; i <= n; i++)
a[i] = -1;
}
else{
for (i = 1; i < n / 2; i++)
a[i] = 1;
a[n / 2] = 0;
for (i = n / 2 + 1; i <= n; i++)
a[i] = -1;
}
for (i = 1; i < n; i++)
for (j = i + 1; j <= n; j++){
if (j > 2) printf(" ");
printf("%d", a[j - i]);//值为1,i->j;-1, j->i
}
printf("\n");
}
}
D. Pythagorean Triples
题意:问满足c=a ^ 2-b和c ^ 2 = a ^ 2 + b ^ 2的三个数的个数。
题解:联立方程组,相减得到c=b+1,相加得到a^2=2b+1。可以发现,当a为奇数时b才有解。同时代换后可以得到c=(a ^ 2 + 1)/2<=n。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t, n, i;
scanf("%d", &t);
while (t--){
scanf("%d", &n);
int res = 0;
for (i = 3; i * i <= 2 * n - 1; i += 2)
res++;
printf("%d\n", res);
}
}