程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Codeforces Round #224 (Div. 2)

Codeforces Round #224 (Div. 2)

編輯:C++入門知識

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<




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved