A題:水題不解釋
B題:
因為b是小於1000的,所以b最多有1000種可能。
找到循環節,把當前狀態模擬至循環節開始狀態。
然後把狀態置為減去一定的循環節個數之後的狀態。
最後模擬出最終狀態。
#include#include #include #include using namespace std; #define maxn 1100 #define LL __int64 LL vis[maxn]; int main() { LL a,b,w,x,c; while(~scanf("%I64d%I64d%I64d%I64d%I64d",&a,&b,&w,&x,&c)) { memset(vis,0,sizeof(vis)); LL times; times=0; while(b>=x) { if(c<=a)break; b=b-x; c--; times++; } if(c<=a) { cout< =x)l=l-x; else { l=w-x+l; aj++; } } LL ns; ns=0; if((c-(a+aj))>0) { ns=(c-a-aj)/(st-aj); } times+=ns*st; c=c-st*ns; a=a-aj*ns; while(c>a) { if(b>=x) { b=b-x; c--; times++; } else { b=w-x+b; c--; a--; times++; } } cout<
c題:水題,依然不解釋。只要情況考慮全就行。d題:
我當時比賽做完前三題之後,時間還剩下46分鐘,稍微看了一下d我就去查人去了。。。沒想到d竟然這麼水。剛剛看看一下d,20分鐘敲出來了,真狠我當初為什麼不敲d!
深搜圖,找出以每個點為起始點,最長能走的步數maxx。
然後尋找是否存在兩個點,使得這兩個點為起始點的時候,走路的過程中不回產生碰撞。
如果找到了,輸出maxx+maxx。
否則,輸出maxx+maxx-1;
#include#include #include #include using namespace std; #define maxn 2200 #define INF 100000000 int maps[maxn][maxn]; int val[maxn][maxn]; int vis[maxn][maxn]; int st[maxn][maxn]; int xx[5]={0,0,1,-1}; int yy[5]={-1,1,0,0}; int n,m; int pan(int x,int y) { if(x<1||x>n||y<1||y>m)return 0; return 1; } int dfs(int x,int y) { if(pan(x,y)==0)return 0; if(vis[x][y])return INF; if(val[x][y]!=-1) { return val[x][y]; } vis[x][y]=1; if(maps[x][y]==-1) { vis[x][y]=0; val[x][y]=0; return 0; } else { int t=dfs(x+xx[maps[x][y]],y+yy[maps[x][y]])+1; vis[x][y]=0; val[x][y]=t; return t; } } int dos(int x,int y,int step) { if(st[x][y]!=-1) { if(st[x][y]!=step||maps[x][y]==-1)return 1; else return 0; } if(maps[x][y]==-1) { st[x][y]=step; return 1; } else { st[x][y]=step; return dos(x+xx[maps[x][y]],y+yy[maps[x][y]],step+1); } } int main() { int i,j; char str[19999]; while(~scanf("%d%d",&n,&m)) { memset(val,-1,sizeof(val)); memset(vis,0,sizeof(vis)); memset(st,-1,sizeof(st)); for(i=1;i<=n;i++) { scanf("%s",str); for(j=1;j<=m;j++) { if(str[j-1]=='#')maps[i][j]=-1; else if(str[j-1]=='^')maps[i][j]=3; else if(str[j-1]=='v')maps[i][j]=2; else if(str[j-1]=='<')maps[i][j]=0; else if(str[j-1]=='>')maps[i][j]=1; } } int maxx; maxx=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(val[i][j]!=-1)continue; if(maps[i][j]==-1)continue; int fs=dfs(i,j); if(fs>=INF)break; maxx=max(maxx,fs); } if(j<=m)break; } if(i<=n) { cout<<"-1"< 1) { cout< n)cout<