Atcoder Regular Contest 084
来源:互联网 发布:东方网络董事长 编辑:程序博客网 时间:2024/06/05 06:02
C Snuke Festival
签到题。
#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;typedef long long ll;const int N=1e5+5;int a[N],b[N],c[N],A,B,C;int a1[N],b1[N],c1[N],n;ll sum[N];int ans1[N];inline int findc(int x){ int l=1,r=C,ans=0; while (l<=r) { int mid=(l+r)>>1; if (x<=c[mid])l=mid+1; else r=mid-1,ans=mid; } return ans;}inline int findb(int x){ int l=1,r=B,ans=0; while (l<=r) { int mid=(l+r)>>1; if (x<=b[mid])l=mid+1; else r=mid-1,ans=mid; } return ans;}int main(){ scanf("%d",&n); fo(i,1,n)scanf("%d",&a[i]); fo(i,1,n)scanf("%d",&b[i]); fo(i,1,n)scanf("%d",&c[i]); sort(a+1,a+1+n); sort(b+1,b+1+n); sort(c+1,c+1+n); A=B=C=n; for(int i=1,j=1;i<=n;i++) { while (c[j]<=b[i]&&j<=C)j++; ans1[i]=n-j+1;//printf("%d\n",ans1[i]); } fo(i,1,n)sum[i]=sum[i-1]+ans1[i]; ll ans=0; for(int i=1,j=1;i<=A;i++) { while (b[j]<=a[i]&&j<=B)j++; ans=ans+1ll*(sum[B]-sum[j-1]); } printf("%lld\n",ans);}
D Small Multiple
题意:给出一个数k,求k的倍数中的一个数,使得这个数的数位和最小。k<=1e5.
感觉做这题智商被碾压了,完全想不到spfa的做法,比赛的时候打数位dp打到倦生都过不去。。
先讲spfa做法:从1开始,向x+1连边,代价为数位差,也就是1,或者向x*10,代价为0,注意是在%k意义下,那么答案就是dis[0]+1,即到达k的倍数中最小的路径。
#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=1e6+5;queue<int>q;int head[N],nxt[N],go[N],val[N],k;int dis[N],vis[N],tot;inline void add(int x,int y,int z){ go[++tot]=y; nxt[tot]=head[x]; val[tot]=z; head[x]=tot;}inline void spfa(int s){ q.push(s),dis[s]=0; vis[s]=1; while (!q.empty()) { int x=q.front(); q.pop(); for(int i=head[x];i;i=nxt[i]) { int v=go[i]; if (dis[v]>dis[x]+val[i]) { dis[v]=dis[x]+val[i]; if (!vis[v]) { vis[v]=1; q.push(v); } } } vis[x]=0; }}int main(){ scanf("%d",&k); fo(i,0,k-1) { add(i,(i+1)%k,1); add(i,i*10%k,0); } memset(dis,127/3,sizeof(dis)); spfa(1); printf("%d\n",dis[0]+1);}
数位DP的话可能更直接一点,具体来说就是记忆化搜索,稍后会放出代码。
设f[i][j]表示数位和为i,当前数模n为j,那么直接记忆化搜索就好了。。
#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=1e5+5;bool f[55][N];int n,k;inline void dfs(int x,int y){ if (x>50||f[x][y])return; f[x][y]=1; fo(i,0,9) { int yy=(y*10+i)%n; dfs(x+i,yy); }}int main(){ scanf("%d",&n); dfs(0,0); int ans=0; fo(i,1,50) { if (f[i][0]) { ans=i; break; } } printf("%d\n",ans); return 0;}
E,F持续更新中。
阅读全文
0 0
- Atcoder Regular Contest 084
- atcoder AtCoder Regular Contest 084 D
- AtCoder Regular Contest 077
- AtCoder Regular Contest 077
- AtCoder Regular Contest 078
- AtCoder Regular Contest 079
- AtCoder Regular Contest 086
- AtCoder Regular Contest 068
- AtCoder Regular Contest 088
- AtCoder Regular Contest 063题解
- AtCoder Regular Contest 069 D
- AtCoder Regular Contest 071 F
- AtCoder Regular Contest 073 D
- AtCoder Regular Contest 076 F
- AtCoder Regular Contest 077-C
- AtCoder Regular Contest 077-D
- AtCoder Regular Contest 077 E
- AtCoder Regular Contest 077 E
- 一个可用的google字体api
- 立体匹配的研究背景以及意义
- 计算机网络作业五
- HNC理论
- Timer 定时器
- Atcoder Regular Contest 084
- [转载]Nginx中文文档
- 数据结构读书笔记(7)----排序总结
- c指针(二)
- 2017116
- 顺序表的基本操作
- 数据结构实验之二叉树八:(中序后序)求二叉树的深度
- 狼抓兔子 BZOJ1001 平面图最小割转对偶图最短路
- Java题目1