A-Arena
题目大意:有n个英雄,英雄之间会不断发生战斗,等级高的英雄会赢。求最后可以赢到100的500次方的英雄数量
思路:战斗不断进行没有条件限制,那么只要这个英雄可以打得过任何一个人那么只要时间不限他就可以完成胜利的场次数量。换句话书,只有有人比他弱就可以,所以答案就是总数减去等级最低的那一批人的数量。
AC代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <climits>
typedef long long ll;
const int maxn=1e3 + 5;
const int INF=0x3f3f3f3f;
using namespace std;
int t,n,tmp;
vector<int> arr;
int main()
{
cin>>t;
while(t--)
{
arr.clear();
cin>>n;
for(int a=0;a<n;a++)
{
cin>>tmp;
arr.push_back(tmp);
}
sort(arr.begin(),arr.end());
for(int a=0;a<n;a++)
{
if(arr[a]!=arr[0])
{
cout<<(n-a)<<endl;
break;
}
if(a==n-1)
{
cout<<0<<endl;
}
}
}
}
B-Cat Cycle
题目大意:有n个地方可以睡觉,A的睡觉地点会从n->1 B为1->n。如果A和B冲突了那么A不动B去下一个地方,求第k次B的位置。
思路:如果n是偶数那么A和B不会冲突就直接求余数算位置,如果是奇数,那么第一次相遇会在第(n/2 + 1)次之后每n/2次相遇一次,计算相遇了几次B就在k的基础上多移动了几次,计算对应位置就好了。
AC代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <climits>
typedef long long ll;
const int maxn=1e3 + 5;
const int INF=0x3f3f3f3f;
using namespace std;
int ca,cb,k,n,t;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
ca = n;
cb = 1;
if(n%2==0)
{
cb = k%n;
}else
{
int meet = n/2+1;
if(k<meet)
{
cb=k;
}else if(k<meet*2-1)
{
cb=k+1;
}else
{
int cnt = (k-meet)/(meet-1)+1;
cb = (k+cnt)%n;
}
}
if(cb==0)cb=n;
cout<<cb<<endl;
}
}
C-Minimum Ties
题目大意:有n支队伍,按照1-2,1-3……1-n,2-3……2-n……n-1-n的顺序比赛。求一种方法可以让最后所有的队伍得分一样,并且平局最少。
思路:可以求出每只队伍最多可以赢几场(对应的就是每支队伍可以输几场)。如:有4支队伍会进行6场比赛,那么每支队伍赢一场,两场平局。就是题目要求的胜利方式。接下来就是找要那几场胜利才可以是所有的队伍得分一样。遍历每一支队伍找他可以击败的队伍(队伍的击败数量还没有达到要求),为了方式分配错误,找的时候前到后和后到前交替着找(AC了但是我没有找到依据,感觉这里可以用优先队列来进行优化,每回弹出所剩击败场次最多的队伍,后面有空来再改)。
AC代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <climits>
typedef long long ll;
const int maxn=1e2 + 5;
const int INF=0x3f3f3f3f;
using namespace std;
int t,n,p[maxn][maxn],wcnt[maxn],dcnt[maxn];
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int a=1;a<=n;a++)
{
wcnt[a]=0;
dcnt[a]=0;
for(int b=1;b<=n;b++)
{
p[a][b] = 0;
}
}
int win = (n-1)/2;
// int win = gn/2;
for(int a=1;a<=n;a++)
{
if(a%2==1)
for(int b=a+1;b<=n;b++)
{
if(!p[a][b])
{
if(wcnt[a]<win)
{
p[a][b] = 1;
p[b][a] = -1;
dcnt[b]++;
wcnt[a]++;
continue;
}
if(dcnt[a]<win)
{
p[a][b] = -1;
p[b][a] = 1;
wcnt[b]++;
dcnt[a]++;
continue;
}
}
}
if(a%2==0)
for(int b=n;b>a;b--)
{
if(!p[a][b])
{
if(wcnt[a]<win)
{
p[a][b] = 1;
p[b][a] = -1;
dcnt[b]++;
wcnt[a]++;
continue;
}
if(dcnt[a]<win)
{
p[a][b] = -1;
p[b][a] = 1;
wcnt[b]++;
dcnt[a]++;
continue;
}
}
}
}
for(int a=1;a<=n;a++)
{
for(int b=a+1;b<=n;b++)
{
cout<<p[a][b];
if(a==n)cout<<endl;
else cout<<" ";
}
}
}
}
D-Pythagorean Triples
题目大意:求在n内有多少组整数同时满足:aa+bb = cc ,aa-b=c。
思路:化简可以求出b=(aa-1)/2 c=(aa+1)/2 因为a,b,c都是整数所以,aa应该是奇数,所以a是奇数(条件1),因为1<=a<=b<=c<=n,所以(aa+1)/2<=n --> a<=sqrt(2n-1) (条件2)。根据条件1和条件2直接暴力就好了(题目不难但是由于c题开始的时候想错了导致最后来不及了,血亏。。。。。)
AC代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <cmath>
#include <climits>
typedef long long ll;
const int maxn=1e5 + 5;
const int INF=0x3f3f3f3f;
using namespace std;
int t,n;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
int cnt=0;
n = sqrt(2*n-1);
for(int a=2;a<n;a++)
{
if(a%2==0)cnt++;
}
cout<<cnt<<endl;
}
}