Educational Codeforces Round 104 (Rated for Div. 2)(A~D)
Educational Codeforces Round 104 (Rated for Div. 2)
A. Arena
签到题,直接看看多少个数比最小的数大就好了。
#include<bits/stdc++.h> #define ll long long int #define mem(a,b) memset(a,b,sizeof) using namespace std; int a[10010]; int main() { int T; cin>>T; while(T--) { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+1+n); int ans = 0; for(int i=1;i<=n;i++) { if(a[i]==a[1]) ans++; } cout<<n-ans<<endl; } return 0; }
B. Cat Cycle
题意:A,B两猫跳格子,A是从n,n-1,n-2,n-3,.....,2,1次序循环跳,而B从1开始1,2,。。。。n-1,n跳,但是他们不能共用一个格子,因为A比较大,所以只能B跳那个格子的下一个,即如果都要跳到第i个那么A在第i个,而B去了i+1个,问第k分钟B在哪。
题解,你可以发现当格子个数为偶数个时永远不会公用一个格子,奇数个时,你每跳n/2个格子的时候他就要多跳1格,然后求出总共会跳几轮就好了。
#include<bits/stdc++.h> #define ll long long int #define mem(a,b) memset(a,b,sizeof) using namespace std; int main() { int T; cin>>T; while(T--) { ll n,k; cin>>n>>k; ll pp = k%n; if(n%2==0) { ll xx = pp==0?n:pp; cout<<xx<<endl; } else{ ll xx = n/2; ll yy = k/xx; //cout<<pp<<endl; if(k%xx==0) yy--; //cout<<xx<<" "<<yy<<endl; int pos = pp==0?n:pp; int poss = ((pos+yy)%n)==0? n:(pos+yy)%n; cout<<poss<<endl; } } return 0; }
C. Minimum Ties
题意:有n只队伍互相踢比赛,若a和b踢,a如果赢了加3分,平了加1分,输了不加分。他们互相不重复踢(n-1)*n/2场比赛,问他们如何出现比赛使所有队比赛积分相同,且平局最少。
题解:分情况讨论,当n为奇数时,每支队踢赢一半输一半就好,用1和-1矩阵的值来构造就好,当n为偶数时,那么我们就每个人多一场比赛是平局,其余一半输一半赢,来继续构造一个矩阵就好了。
#include<bits/stdc++.h> #define ll long long int #define mem(a,b) memset(a,b,sizeof a) using namespace std; int a[110][110]; int main() { int T; cin>>T; while(T--) { int n; cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i == j) a[i][j] = 0; else a[i][j] = 1; } } if(n%2){ for(int i=1;i<=n;i++) { int ans = 0; for(int j=1;j<=n;j++) { if(i!=j) ans+=a[i][j]; } int flag = 1; if(ans) flag = -1; if(n%2) { for(int j=n;j>=1;j--) { if(ans==0) break; a[i][j] = flag; a[j][i] = -flag; ans += 2*flag; } for(int j=n;j>=1;j--) { a[j][i] = -a[i][j]; } } else{ if(ans>0) ans--; else if(ans<0) ans++; a[n][i] = 0; a[i][n] = 0; for(int j=n-1;j>=1;j--) { if(ans==0) break; a[i][j] = flag; a[j][i] = -flag; ans += 2*flag; } for(int j=n;j>=1;j--) { a[j][i] = -a[i][j]; } } } } else{ for(int i=1;i<=n;i++) { for(int j=1;j<=n-i;j++){ if(j==n/2) { a[i][i+j] = 0; } else if(j>n/2) { a[i][i+j] = -1; } else a[i][i+j] = 1; } } } 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)满组勾股定理和
c=a2−b,1≤a≤b≤c≤n
#include<bits/stdc++.h> #define ll long long int #define mem(a,b) memset(a,b,sizeof a) using namespace std; int main() { int T; cin>>T; while(T--) { ll n; cin>>n; n*=2; n--; int x = sqrt(n);x--; cout<<x/2<<endl; } return 0; }
属实打的太菜了。。。。。