赛后反思:
B. 用到除法需要考虑是否会卡除法的向下取整
能走贪心模拟那就走贪心模拟
普通的贪心还是练少了
C.思想搞错吓自己 应该分析数据范围的
cf通常都是思维题 不要动不动就搞什么算法
(具体注释看代码)
A题 (队友推公式 我做工具人)
直接公式走
signed main()
{
ll t;
///scanf("%d",&t);
cin>>t;
ll n,m,x;
while(t -- )
{
// scanf("%d%d%d",&n,&m,&x);
cin>>n>>m>>x;
ll ans = 0;
ll temp =x/n;
if(x%n)
ans = (ll)(temp +1+(x%n -1 )*m);
else
ans = (ll)((n-1)*m+temp);
cout<<ans<<endl;
}
return 0;
}
B. Partial Replacement
本来以为还是公式题就一直走
虽然也考虑过贪心走for 但是还是懒 而且推公式貌似有可行性
#include <bits/stdc++.h>
using namespace std;
const int N = 400;
char s[N];
typedef unsigned long long ll;
int main()
{
int t;
cin>>t;
/// int ans = 0;
while(t -- )
{
int n , k ;
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>s[i];
int sr =0 ;
int ed =0 ;
/// ++ans;
for(int i=1;i<=n;i++)
{
if(s[i] =='*'&&!sr)
sr = i;
if(s[i] =='*')
ed = i;
}
int d = ed -sr;
if(ed == sr)
cout<<1<<endl;
else
{
int temp = d/k;
if(d%k)
temp ++;
cout<<temp+1<<endl;
}
}
/// cout<<ans;
return 0;
}
公式既然用到了除法 就得考虑是否会卡除法
测试数据给的 是能过的因为正好会被除完
但是呢 如果是7 3 &.&.&.& (&代替* 因为文本问题) 这样子除的时候就会向下取整
给搞掉了
所以 我们还是选择走贪心
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
string s;
cin>>s;
int ans = 0,strt=-1,end=-1;
for(int i=0; i<n; i++)
{
if(s[i]=='*')
{
s[i] = 'x';
strt = i;
ans++;
break;///找到就退
}
}///找第一个*
while(true)
{
int j = min(n-1,strt+k);
///枚举每一个区间开始走
for( ; strt<j && s[j]=='.'; j--)
{
}
if(strt==j)///如果正好没有那么直接break
{
break;
}
ans++;///如果有的话ans++
strt = j;///那么就从离X最远但是又是保证了 <k的情况下开始出发
}
cout<<ans<<"\n";///直接输出
}
return 0;
}
C.字符串的处理
乍一看以为是双向广搜直接劝退我这鶸选手
赛后看了题解
tmd 是个暴力 好吧
吃一堑唱一智 的确数据范围这么小 用不到双向广搜优化
我sb
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
string a, b;
cin >> a >> b;
int n = a.size(), m = b.size();
int ans = 0;
for (int len = 1; len <= min(n, m); len++)
///肯定是最小 最小的限制大的范围所以是最小
{
for (int i = 0; i + len <= n; i++)
{
///模拟A所有的情况
for (int j = 0; j + len <= m; j++)
{
///模拟B所有情况
if (a.substr(i, len) == b.substr(j, len))
{
ans = max(ans, len);
///取最大的公共子串
}
}
}
}
cout << a.size() + b.size() - 2 * ans << "\n";
///那么和肯定最小
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
while (n--)
{
solve();
}
}