考试状态:
我今天抽签看了洛谷的…
这我能怂???凶中带吉,我怕考试??我!不!怕!
看着整个机房的男同学们,我明白我是不会触发我的忌了。很好,开刷。
麦芽的香气。行家啊!这题刷过的吧!!这个数据看起来是有点吓人,然而…
并没什么卵用。就是吓吓你。
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; int main(){ // freopen("prime.in","r",stdin); // freopen("prime.out","w",stdout); int n; cin>>n; for(int i=2;i<=n;i++){ if(n%i==0){ cout<<n/i; return 0; } } }
仔细看题,看清楚了题目,这题就是个连printf都懒得用的水题…
好的下一个。
这种玩意…边看题边写…不断重构…不断修改…不断Debug
好吧,用搜索模拟一下其实就好了。
因为是边看边写,所以代码有点冗杂,有许多压根用不到的数据我也顺手存了下来。没事,反正一点点数据并不会爆炸。
#include<iostream> #include<cstdio> const int Mod=20123; using namespace std; struct BedRoom{ bool Up; int Pointer; int Num; int Next; }Building[10005][105]; int Ftot[10005]; int n,m,x,y,ans; void dfs(int Floor,int Room){ //cout<<"time check "<<Floor<<" "<<Room<<" "<<ans<<endl; if(Floor==n){ //cout<<"End"<<endl; ans+=Building[Floor][Room].Pointer; ans%=Mod; return; } int Go=Building[Floor][Room].Pointer; //cout<<"Go "<<Go; ans+=Go; ans%=Mod; if(Building[Floor][Room].Up==true){ Go--; } //Go%=Ftot[Floor]; int Index=Room; for(int i=1;i<=Go;){ //if(dfs(Floor,Building[Floor][Room].Next)) Index=Building[Floor][Index].Next; if(Building[Floor][Index].Up){ i++; } } dfs(Floor+1,Index); } int main(){ // freopen("treasure.in","r",stdin); // freopen("treasure.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ for(int j=0;j<m;j++){ scanf("%d%d",&x,&y); Building[i][j].Up=x; if(x){ Ftot[i]++; } Building[i][j].Num=j; Building[i][j].Pointer=y; Building[i][j].Next=j+1; if(j+1==m){ Building[i][j].Next=0; } } } scanf("%d",&x); dfs(1,x); printf("%d",ans); }
看起来是简单轻巧…实际上显然这题是需要小小的优化的。一看那个指示牌上的爆炸数据就知道,如果直接傻兮兮的模拟, 你可能会疯狂跟他绕圈子,最后的结果嘛…当然你是TLE啦!
怎么优化?把指示牌上的数字MOD掉这一层所有的有楼梯的房间的个数就好。虽然我刚打完就想到了这个优化点,并且去做了优化。但发现直接取模之后居然疯狂WA!
无奈之下,只好放弃优化。先拿下模拟辛苦分好了。
出乎意料,辛苦分给的并不低。足足五十分呀同志,一半呐!!
(废话真多)
经过WKJ的指点,所以其实在取模的时候要考虑下直接Mod出0的情况,直接成0的话就会发生奇妙的错误。所以我们不妨把他先-1,最后再加回来就是了。
#include<iostream> #include<cstdio> const int Mod=20123; using namespace std; struct BedRoom{ bool Up; int Pointer; int Num; int Next; }Building[10005][105]; int Ftot[10005]; int n,m,x,y,ans; void dfs(int Floor,int Room){ //cout<<"time check "<<Floor<<" "<<Room<<" "<<ans<<endl; if(Floor==n){ //cout<<"End"<<endl; ans+=Building[Floor][Room].Pointer; ans%=Mod; return; } int Go=Building[Floor][Room].Pointer; //cout<<"Go "<<Go; ans+=Go; ans%=Mod; if(Building[Floor][Room].Up==true){ Go--; } Go=(Go-1)%Ftot[Floor]+1; int Index=Room; for(int i=1;i<=Go;i=i){ //if(dfs(Floor,Building[Floor][Room].Next)) Index=Building[Floor][Index].Next; if(Building[Floor][Index].Up){ i++; } } dfs(Floor+1,Index); } int main(){ // freopen("treasure.in","r",stdin); // freopen("treasure.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ for(int j=0;j<m;j++){ scanf("%d%d",&x,&y); Building[i][j].Up=x; if(x==1){ Ftot[i]++; } Building[i][j].Num=j; Building[i][j].Pointer=y; Building[i][j].Next=j+1; if(j+1==m){ Building[i][j].Next=0; } } } scanf("%d",&x); dfs(1,x); printf("%d",ans); }
还行吧。代码有点冗杂,但在脑海里的逻辑还是很清晰的。
下一个。
如果说考到以前刷过的作业是幸运,那这个简直就是幸运的1024次方了。
以前的考试考过。
#include<iostream> #include<cstdio> using namespace std; const int MAXN=105; int n,m; int a[MAXN]; int dp[MAXN][MAXN]; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } dp[0][0]=1; for(int i=1;i<=n;i++) for(int k=0;k<=a[i];k++) for(int j=0;j<=m-k;j++) dp[i][j+k]=(dp[i-1][j]+dp[i][j+k])%1000007; cout<<dp[n][m]; }
i来代表花种类,k代表花的盆数,j代表这种花放的盆数。
状态转移方程:dp[i][k]+=dp[i-1][j]
原文:https://www.cnblogs.com/Uninstalllingyi/p/10703790.html