TP1 统计单词数

思路: 题目说明: 一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0 开始);如果单词在文章中没有出现,则直接输出一个整数 -1。 从中我们可以知道:

  • 首先我们要找到s1在数组中第一次出现的位置,这件事我们可以用findfind来解决
  • 其次我们就需要计算出现了多少次,我们可以通过累加解决
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int main()
{
	freopen("cal.in","r",stdin);
	freopen("cal.out","w",stdout);
	getline(cin,s1);
	getline(cin,s2);
	for(int i=0;i<s1.size();i++)
		if(s1[i]>='A'&&s1[i]<='Z')
			s1[i]+=32;
	for(int i=0;i<s2.size();i++)
		if(s2[i]>='A'&&s2[i]<='Z')
			s2[i]+=32;
	s1=" "+s1+" ";
	s2=" "+s2+" ";
	long long idx=0,cnt=0;
	while((int)s2.find(s1,idx)!=-1)
	{
		idx=(int)s2.find(s1,idx)+s1.size()-2;
		cnt++;
	}
	if((int)s2.find(s1)==-1) cout<<"-1";
	else cout<<cnt<<" "<<s2.find(s1);
	return 0;
}

TP2 瑞士轮

思路: 通过暴力解的简化写出来

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
struct P
{
	long long fen;
	long long shi;
	long long bian;
}a[N];
P win[N],lose[N];
bool cmp(P a,P b)
{
	if(a.fen!=b.fen) return a.fen>b.fen;
	else return a.bian<b.bian;
}
int main()
{
	freopen("ruishi.in","r",stdin);
	freopen("ruishi.out","w",stdout);
	long long n,r,q;
	cin>>n>>r>>q;
	n*=2;
	for(int i=1;i<=n;i++) cin>>a[i].fen;
	for(int i=1;i<=n;i++) cin>>a[i].shi;
	for(int i=1;i<=n;i++) a[i].bian=i;
	sort(a+1,a+n+1,cmp);
	while(r--)
	{
		int i1=0,i2=0,i=1;
		for(i=1;i<n;i+=2)
		{
			if(a[i].shi>a[i+1].shi) 
			{
				a[i].fen++;
				win[++i1]=a[i];
				lose[++i2]=a[i+1];
			}
			else if(a[i].shi<a[i+1].shi) 
			{
				a[i+1].fen++;
				win[++i1]=a[i+1];
				lose[++i2]=a[i];
			}
		}
		i1=1,i2=1,i=1;
		while(i1<n/2&&i2<n/2)
		{
			if(cmp(win[i1],lose[i2])) a[i++]=win[i1++];
			else a[i++]=lose[i2++];
		}
		while(i1<=n/2) a[i++]=win[i1++];
		while(i2<=n/2) a[i++]=lose[i2++];
	}
	cout<<a[q].bian;
	return 0;
}