比赛链接:ABC335
签到题。我签签签签——
#include <bits/stdc++.h>
using namespace std;
int main(){
string str;
cin>>str;
str[str.size()]='4';
cout<<str<<endl;
return 0;
}
又双叒叕是签到题。于是我签签签签——
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
for(int x=0;x<=n;x++){
for(int y=0;x+y<=n;y++){
for(int z=0;x+y+z<=n;z++)
cout<<x<<' '<<y<<' '<<z;
}
}
return 0;
}
注:先讲D是因为C>D(个人向)。
水题。就是打印螺旋矩阵。
#include <bits/stdc++.h>
using namespace std;
int grid[50][50];
int main(){
int n;
cin>>n;
int r=0,c=0;
int num=1;
int tmp=n;
grid[0][0]=num;
for(int i=0;i<(n-1)/2;i++){
for(;c<tmp-1;c++)
grid[r][c]=num++;
for(;r<tmp-1;r++)
grid[r][c]=num++;
for(c=tmp-1;c>i;c--)
grid[r][c]=num++;
for(r=tmp-1;r>i;r--)
grid[r][c]=num++;
tmp--;
r++;
num--;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<grid[i][j]<<' ';
cout<<endl;
}
return 0;
}
这题有一点点难度(也许是我太菜,我赛时TLE了,悲)。在网上康到了一种新奇思路,就是龙每动一下,就加一个头,砍掉一截尾巴。然后龙用deque维护。代码如下:
#include <bits/stdc++.h>
using namespace std;
deque<pair<int,int>> dragon;
int main(){
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)
dragon.push_back({i,0});
while(q--){
int op;
cin>>op;
if(op==1){
char c;
cin>>c;
int x=dragon.front().first;
int y=dragon.front().second;
if(c=='R')
x++;
if(c=='L')
x--;
if(c=='U')
y++;
if(c=='D')
y--;
dragon.push_front({x,y});
dragon.pop_back();
}
else{
int p;
cin>>p;
cout<<dragon[p-1].first<<dragon[p-1].second<<endl;
}
}
return 0;
}
提供一种不一样的思路。既然不能下降,那就把权值一样的点压成一个点(并查集),然后重新建图,在新图上做记忆化搜索。放个代码(快过年了,博主心情不太好,所以就不挖坑了):
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000005;
pair<int,int> graph[maxn];
int mem[maxn],a[maxn],parent[maxn];
int e[maxn],nxt[maxn],idx,head[maxn];
int find(int x){
if(parent[x]!=x)
parent[x]=find(parent[x]);
return parent[x];
}
void add_edge(int a,int b){
e[idx]=b;
nxt[idx]=head[a];
head[a]=idx++;
}
int dfs(int u){
if(mem[u]!=-1)
return mem[u];
mem[u]=-1e9;
for(int i=head[u];i!=-1;i=nxt[i]){
int v=e[i];
if(a[v]<a[u])
mem[u]=max(mem[u],dfs(v)+1);
}
return mem[u];
}
int main(){
int n,m;
cin>>n>>m;
memset(head,-1,sizeof(head));
memset(mem,-1,sizeof(mem));
for(int i=1;i<=n;i++) {
cin>>a[i];
parent[i]=i;
}
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
graph[i]=make_pair(u,v);
if(a[u]==a[v])
parent[find(v)]=find(u);
}
for(int i=1;i<=m;i++){
int u=find(graph[i].first);
int v=find(graph[i].second);
if(u!=v){
add_edge(u,v);
add_edge(v,u);
}
}
mem[find(1)]=1;
int ans=dfs(find(n));
cout<<max(0,ans)<<endl;
return 0;
}
以上就是本期的全部内容了,下期更新Atcoder ABC336 A-D题解。
友情提醒:本期所有的代码都有问题,所以请不要无脑Ctrl C+Ctrl V