- 高镜铠 的博客
8.7
- @ 2024-8-7 17:43:00
TP1 统计单词数
思路: 题目说明: 一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0 开始);如果单词在文章中没有出现,则直接输出一个整数 -1。 从中我们可以知道:
- 首先我们要找到s1在数组中第一次出现的位置,这件事我们可以用来解决
- 其次我们就需要计算出现了多少次,我们可以通过累加解决
#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;
}