abc261_a
题目翻译
问数轴上 $[l_1,r_1]$ 和 $[l_2,r_2]$ 重叠长度。
题目思路
注意数轴上,不是问重叠数字个数。
罚时带来的教训。
AC 代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int l1,r1,l2,r2,ans=0;
cin>>l1>>r1>>l2>>r2;
for(int i=l1;i<=r1;i++)
{
if(l2<=i&&i<=r2)ans++;
}
cout<<max(0,ans-1)<<endl;
return 0;
}
abc261_b
题目翻译
有 $n$ 个人对局,生成了 $n \times n$ 大小的结果表。
$a_{i,j}$ 即为第 $i$ 人对第 $j$ 人的结果。
W
为胜利。
L
为失败。
-
为未知,任何结果都可能。
D
为平局。
问结果表是否合法。
题目思路
直接扫一遍。
AC 代码
#include<bits/stdc++.h>
using namespace std;
char a[1020][1020];
int main()
{
int n;
bool f=0;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[j][i]=='D'&&a[i][j]=='D'||a[j][i]=='W'&&a[i][j]=='L'||a[j][i]=='L'&&a[i][j]=='W'||a[j][i]=='-'||a[i][j]=='-')
{
}
else
{
f=1;
}
}
}
puts(f==1?"incorrect":"correct");
return 0;
}
abc261_c
题目翻译
新建文件或文件夹时,若名字重复,往往会命名为 新建文件夹(1)
的名字。
给出创建的文件,输出最后命名。
题目思路
map
练习题,很裸,不多说。
AC 代码
#include<bits/stdc++.h>
using namespace std;
map<string,int>m;
int main()
{
int n;
cin>>n;
while(n--)
{
string s;
cin>>s;
m[s]++;
if(m[s]==1)cout<<s<<endl;
else cout<<s<<"("<<(m[s]-1)<<")"<<endl;
}
return 0;
}
abc261_d
题目翻译
有 $n$ 个数 $a_1,a_2,\dots a_n$。
你可以抛 $n$ 次硬币,第 $i$ 次正面可以获得 $a_i$ 的分数,并记录连击。
连击数达到指定值时,会获得连击奖励。
题目思路
我们用 $f_{i,j}$ 表示前 $i$ 次最后连击次数。
分两种情况:
- 延续连击:$f_{i,j}=f_{i-1,j-1}+连击奖励+分数$
- 停止连击:$f_{i,0}=\max(f_{i,0},f_{i-1,j})$
AC 代码
#include<bits/stdc++.h>
using namespace std;
int a[5020];
int b[5020];
long long f[5020][5020];
int main()
{
int n,m;
long long ans=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
while(m--)
{
int x,y;
cin>>x>>y;
b[x]=y;
}
f[1][1]=a[1]+b[1];
for(int i=1;i<=n;i++)
{
for(int j=0;j<i;j++)
{
f[i][j]=f[i-1][j-1]+b[j]+a[i];
f[i][0]=max(f[i][0],f[i-1][j]);
}
f[i][i]=f[i-1][i-1]+a[i]+b[i];
}
for(int i=0;i<=n;i++)ans=max(ans,f[n][i]);
cout<<ans<<endl;
return 0;
}