C. Game with Chips
题意
给你一个n,m的棋盘,再给你k个棋子的坐标,让你移动经过接下来对应的k个位置。
可以所有棋子到一个格子。
当移动到边界的时候再往边界走则原地不动。
求所有棋子走的路线能够满足题意的,步数不超过2nm次。
LRUD对应移动的方向,输出构造的路径。
思路
构造题
当时打的时候一直在想如何构造最优路径,是BFS呢还是啥。
现在想想当时真的蠢,打一个EDU第C题没那么麻烦。
其实这道题的关键在于读题,步数不超过2nm,仔细想想所有格子移动到某个角落然后再S形遍历全图,这样的步数也不可能超过2nm。
读题很重要,注意一下数据的范围,有利于构造合理的算法。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll maxn = 1e6 + 5;
ll n,m,k;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=2*k;i++){
int x,y;
cin>>x>>y;
}
cout<<n*(m-1)+2*n+m-3<<'\n';
for(int i=1;i<=m-1;i++){
cout<<'L';
}
for(int i=1;i<=n-1;i++){
cout<<'U';
}
for(int i=1;i<=n;i++){
if(i>1) cout<<'D';
for(int j=1;j<=m-1;j++) cout<<((i%2==1)?'R':'L');
}
return 0;
}
E. Count The Blocks
题意
给你一个整数n,求 10n内(每个数有前导零)长度为1到n的块分别有多少个。块的含义是连续相同数字的长度。
思路
找规律
f[n]=n∗10n−sum[n−1]−(a[1]∗10n−1+a[2]∗10n−2+...+a[n−1]∗101)
sum[n]=sum[n−1]+f[n]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 998244353;
const ll maxn = 1e6 + 5;
ll ans[maxn],s[maxn],a[maxn];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;cin>>n;
a[0]=1;
for(int i=1;i<=n;i++) a[i]=(a[i-1]*10)%mod;
ll res=0,k=0;
for(int i=1;i<=n;i++){
ans[i]=(i*a[i]-s[i-1]-k+2*mod)%mod;
s[i]=(s[i-1]+ans[i])%mod;
k=(k+s[i])%mod;
}
for(int i=n;i>=1;i--){
cout<<ans[i]<<" ";
}
return 0;
}