@TOC
前言
这场出的很好,满满的罚座QAQ
传送门 :
A.
没看范围,T了一发 (感觉笑了
先判断两个数 他们的$ws(x)+p$ 也就是位数和$p$ 的和的长度
如果能直接比 那么就输出
否则只剩下$==$的情况
对于等于的情况,我们只需要让,这两个数乘上较少的$min(p1,p2)$ 直接比大小就行
没仔细想过,就感觉不会T,直接交了,希望不要被hack
CODE
void solve()
{
ll x1,p1;
ll x2,p2;
cin>>x1>>p1;
cin>>x2>>p2;
int wsx1 = getws(x1); //自己写的获得位数的函数
int wsx2 = getws(x2);
if(p1+wsx1>p2+wsx2)
{
cout<<">"<<endl;
return;
}
if(p1+wsx1 < p2+wsx2)
{
cout<<"<"<<endl;
return;
}
int d = abs(wsx1-wsx2);
if(wsx1<wsx2)
{
for(int i = 1;i<=d;i++)
x1*=10;
}
else
{
for(int i=1;i<=d;i++)
x2*=10;
}
if(x1>x2)
cout<<">"<<endl;
else
if(x1<x2)
cout<<"<"<<endl;
else
cout<<"="<<endl;
}
B.
一开始的想法,直接排序 然后 对于$\frac{n}{2}$ 我们每次都输出 $(s[i],s[1])$
一猜这个结论,过了hh
其实简单的证明一下也是可以的
因为一个数的模,不会比这个数大,因此从大到小排序之后,就没有比小的更小了,直接
输出即可
CODE
void solve()
{
ll n,h;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
for(int i=2;i<=n/2+1;i++)
{
cout<<a[i]<<" "<<a[1]<<endl;
}
}
C.
摆明是二分答案
而且是很常见的二分答案 和 最基础的那个 分木头
这个题差不多
(因为里面一个+1,让我调了好久
CODE
bool check(ll k)
{
ll sum = 0 ;
for(int i=2;i<=n;i++)
{
if(a[i-1] + k >= a[i])
sum+= a[i]-a[i-1];
else
sum+=k;
}
sum+=k;
if(sum >= h )
return true;
else
return false;
}
void solve()
{
cin>>n>>h;
for(int i=1;i<=n;i++)
cin>>a[i];
ll l = 1 ,r =1e18;
while(l<r)
{
ll mid = l+r>>1;
if(check(mid))
r = mid;
else
l = mid+1;
}
if(check(l))
cout<<l<<endl;
else
cout<<l+1<<endl;
}
E.
观察之后会发现,我们可以从 ‘L’ 开始bfs,然后对于每一个 $.$ 如果周围 只有$<=1$个
$.$ 的时候,那么这个点必然是 ‘+’,按照这个模拟即可
(其实看样例也挺好看出来的吧 hh
不过这题一直在调,不是$TLE$ 就是 $RE$ 最后索性 $solve$ 和$check$ 全删了全部
写在了一个$main$ 里面
CODE
int t;
cin>>t;
while(t -- )
{
int n,m;
cin >> n >> m;
vector<string> s(n);
for (auto& x : s) cin >> x;
int sx = -1, sy = -1;
for (int i =0 ; i < n; i++)
for (int j = 0; j < m; j++)
if (s[i][j] == 'L')
sx = i, sy = j;
vector<int> dx = {0,1,0,-1};
vector<int> dy = {1,0,-1,0};
auto check = [&](int x, int y)->bool //通过上一场学的正则表达式
{ //分成函数写莫名RE
vector<pair<int,int>> poss;
int cnt = 0;
for (int k = 0; k < 4; k++)
{
int nx = x + dx[k], ny = y + dy[k];
if (nx < 0 || ny < 0 || nx >= n || ny >= m || s[nx][ny] == '#') continue;
if (s[nx][ny] == '+' || s[nx][ny] == 'L') cnt++;
poss.push_back({nx,ny});
}
if(cnt >= (int)poss.size()-1) return true;
return false;
};
queue<pair<int,int>> q;
q.push({sx,sy});
while(q.size())
{
auto [x,y] = q.front();
q.pop();
for (int k = 0; k < 4; k++)
{
int nx = x + dx[k], ny = y + dy[k];
if (nx < 0 || ny < 0 || nx >= n || ny >= m || s[nx][ny] == '#' || s[nx][ny] == '+' || s[nx][ny] == 'L') continue;
if (check(nx,ny))
{
s[nx][ny] = '+';
q.push({nx,ny});
}
}
}
for (auto& x : s)
cout << x << '\n';
}
补题问题
D. 貌似是一个DP,但是不会
传送门 : 和今天这个做的好像差不多的思路,但是不会 $check$
F. 某个大佬说和ICPC上海B一个思路 (我爬了