昨天的比赛,可以说打的非常烂。这场比赛去年打了,当时出了四道题,现在还是四道。所以可以说这次打的非常烂了。
三个人状态都不是很好。本来能轻松搞定的数位dp最后怎么测答案都对1e9都秒出结果,结果居然是TLE。这让我很不解。
赛后换了思路,学习了16进制的输入方法,从头开始重新打一遍,一下就A了。
ZOJ 3962 D.Seven Segment Display / The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple D.数位dp,AC代码如下:
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<algorithm> #include<cmath> #include<map> #include<string.h> #define ll long long using namespace std; const int maxn=20; ll dp[maxn][510]; ll a[maxn]; ll n,m,k,x,y,ans,tmp,cnt,sum,len,l,r,d; ll mp[]={6,2,5,5,4,5,6,3,7,6,6,5,4,5,5,4}; ll dfs(int pos,ll sum,bool limit) { if(pos==-1) return sum; if(!limit&&dp[pos][sum]!=-1) return dp[pos][sum]; int end=limit?a[pos]:15; ll ans=0; for(int i=0;i<=end;i++) { ans+=dfs(pos-1,sum+mp[i],limit&&i==end); } if(!limit) dp[pos][sum]=ans; return ans; } ll solve(ll x) { if(x<0) return 0; memset(a,0,sizeof(a)); int pos=0; while(x) { a[pos++]=x%16; x/=16; } return dfs(7,0,1); } int main() { int T; scanf("%d",&T); while(T--) { memset(dp,-1,sizeof(dp)); scanf("%lld%llx",&d,&x);//十六进制输入 d--; if(x+d>=4294967296) printf("%lld\n",solve(x+d-4294967296)+solve(4294967295)-solve(x-1)); else printf("%lld\n",solve(x+d)-solve(x-1)); } return 0; }
还有一题就是E题 ZOJ 3963 Heap Partition(贪心+set)
自己写的不是TLE就是WA,赛后看了AC的代码。。。真的很妙,弄懂了以后自己赶紧去敲了一发AC:
#include<bits/stdc++.h> using namespace std; const int maxn=100010; typedef long long ll; #define lson i*2,l,m #define rson i*2+1,m+1,r const int mo=1e9+7; map<int,int>mp; int n,m,k,nn,mm; int mmp[maxn]; int c[maxn],f,g; int a[maxn]; int ans[2000010],num[maxn]; vector<int>vc[maxn]; struct node { int id; int v; bool operator<(node aa)const { return a[id]<a[aa.id]||a[id]==a[aa.id]&&id<aa.id; } }q; int d[maxn]; set<node>st; set<node>::iterator it; int main() { int T,t; scanf("%d",&T); { while(T--) { f=0;st.clear(); scanf("%d",&n); for(int i=1;i<=n;i++) { mmp[i]=0; scanf("%d",&a[i]); q.id=i; it=st.upper_bound(q); if(it==st.begin()) { vc[++f].clear(); vc[f].push_back(i); q.v=f; st.insert(q); } else { it--; node vv=*it; mmp[vv.id]--; if(mmp[vv.id]==-2) st.erase(it); vv.id=i; st.insert(vv); vc[vv.v].push_back(i); } } printf("%d\n",f); int j=0; for(int i=1;i<=f;i++) { int x=vc[i].size(); printf("%d",x); for(int j=0;j<x;j++) printf(" %d",vc[i][j]); puts(""); } //printf("%d\n",ans); } } return 0; }离省赛越来越近了,加油!!!