A. Arena
n个英雄有a[i]水平,随机选两个对抗,水平高的获胜,问获胜的英雄数量。
枚举每一种情况。
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int vis[105],a[105];
int main() {
int t,n;
cin>>t;
while(t--){
cin>>n;
memset(vis,0,sizeof vis);
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(a[i]<a[j])vis[j]=1;
else if(a[i]>a[j])vis[i]=1;
}
}
int res=0;
for(int i=0;i<n;i++)if(vis[i])res++;
cout<<res<<'\n';
}
return 0;
}
B. Cat Cycle
给定n(A,B在1~n范围内绕圈走),有A,B,A一直往左走,B一直往右走,走到头下一步从各自开头继续走,但是有一种特殊情况,两个人都走x时,A会抢到这个位置,而B会走x的下一个位置。求第k步B的下标。
k偶数很容易发现A,B不会抢夺位置,因此都是正常走k%n即可。
k奇数:
当n=3时发现N=x+1,也就是第N步会碰撞一次。
当n=5时,N=2x+1,第(x正整数)N步碰撞
当n=7,N=3x+1,第N步碰撞。
因此当n=n,N=n/2*x+1。此时令N=k,就能求出多走的x步。
因为我们每碰撞一次实际上B会多走一个位置,所以我们求碰撞次数+k就能知道第k步的下标
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int main() {
int t;
cin>>t;
while(t--){
int n,k;
cin>>n>>k;
if(n&1){
int temp=(k-1)/(n/2);
int res=(k+temp)%n;
if(res==0)cout<<n;
else cout<<res;
}else{
int res=k%n;
if(res==0)cout<<n;
else cout<<res;
}
cout<<'\n';
}
return 0;
}
D. Pythagorean Triples
给你c=a^2 -b和c^2 =a^2 +b^2 然后求有多少个(a,b,c)满足该条件。(n<=1e9)
通过上述公式消去c,得到a^2 =2*b+1,可以知道a最低是3(通过b来求a,a,b,c都是正整数),同时也可以求出c=(a*a+1)/2,b=(a*a-1)/2。所以枚举a,来判断b,c是否符合条件。而且这种满足的条件很少,所以可做
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5;
void solve()
{
int t;
cin>>t;
while(t--){
ll n,res=0;
cin>>n;
for(int i=3;i<=n;i++){
if((1ll*i*i+1)/2>n)break;
if((1ll*i*i+1)%2==0&&(1ll*i*i-1)%2==0)res++;
}
cout<<res<<'\n';
}
}
int main() {
solve();
return 0;
}