这两题,都是应该赛场上A出来的。
K.独立钻石
当时一直关注点在 I. Path Planning,没关注榜单,K,也能写,也就是dfs,从数据范围可以看出,直接暴力搜索。
代码
c
#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int n,m,kk,x,y,a[15][15],ans;
int b[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void dfs()
{
ans=min(kk,ans);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(a[i][j]==1)
{
for(int l=0;l<4;l++)
{
int ii=i+b[l][0],jj=j+b[l][1];
if(a[ii][jj]==1)
{
int iii=ii+b[l][0],jjj=jj+b[l][1];
if(a[iii][jjj]==0&&iii>=1&&iii<=n&&jjj>=1&&jjj<=m)//这个范围要界定
{
kk--;
a[i][j]=0,a[ii][jj]=0,a[iii][jjj]=1;//补题时,错写成双等,又费了不少时间
dfs();
kk++;
a[i][j]=1,a[ii][jj]=1,a[iii][jjj]=0;
}
}
}
}
}
}
void solve()
{
memset(a,0,sizeof(a));
cin>>n>>m>>kk;
for(int i=0;i<kk;i++)
{
cin>>x>>y;
a[x][y]=1;
}
ans=kk;
dfs();
cout<<ans<<'\n';
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
G.邪恶铭刻
在这场中,只写出一道签到题,此题并不难,也不复杂,从前往后算就行了。当时,第一思路,先入为主,一直被绕在里边,改了十几次,改一次,发现一个漏洞,一直在完善特判,应该想到,既然有那么多漏洞,那思路方法就有问题,肯定有更优解法,答案也是这样,将近五个小时的debug太傻了,毫无用处。
(错误思路:考虑1,-1,过程中用1,0作-1的弥补,最后将剩余0判断变成什么,其实究竟如何,心里是没底的,妄想投机取巧。判断剩余0,也是多此一举,遍历中已经可以得到答案)
正确: 0优先考虑-1,否则1,当遇到-1,且分母不足时,就将变为-1 的0再变回来
最大公约数 __gcd(p,q)
代码
c
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int p=1,q=1,n,sum=0,f=0;
cin>>n;
while(n--)
{
int k;
cin>>k;
if(f==0)
{
if(k==0)
{
if(q<2) p++,q++;
else q--,sum++;
}
else if(k==1)
p++,q++;
else
{
if(q<2)
{
if(sum<1)
{
cout<<"-1"<<'\n';
f=1;
}
else sum--,p++,q++;
}
else q--;
}
}
}
if(f==0)
cout<<p/__gcd(p,q)<<" "<<q/__gcd(p,q)<<'\n';
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}