Educational Codeforces Round 104 A-D


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;
	}
} 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值