2015 湘潭大學程式設計比賽(Internet)

來源:互聯網
上載者:User

前段時間,由於校園網的問題,一直打不開csdn,再加上前陣子的懈怠,我已經很久沒寫部落格了,不過,為了即將到來的省賽和藍

橋杯,我決定要改過自新,奮發向上。

題目連結:http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/38

仙劍奇俠傳 題目連結: http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1225

水題,不解釋。

#include<iostream>#include<cstdio>using namespace std;int main(){    int T;    scanf("%d",&T);    while(T--)    {        int i,n,l,ans=0,x,tmp=100;        scanf("%d%d",&n,&l);        for(i=0;i<n;i++)        {            scanf("%d",&x);            if(l>=x)                ans+=10/(l-x+1);            if(ans>=tmp)            {                tmp+=100;                l++;            }        }        printf("%d %d\n",l,ans);    }    return 0;}


摺疊

題目連結:

http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1226

水題,不解釋。

#include<iostream>#include<string>#include<cstdio>using namespace std;int main(){    int T;    scanf("%d",&T);    while(T--)    {        int i,l,a=0,b=0;        string str;        cin>>str;        l=str.size();        if(l==1)            cout<<str<<endl;        else if(l%2==0)        {            for(i=0;i<l/2;i++)                a=a*10+str[i]-'0';            for(i=l-1;i>=l/2;i--)                b=b*10+str[i]-'0';            printf("%d\n",a+b);        }        else        {            for(i=0;i<=l/2;i++)                a=a*10+str[i]-'0';            for(i=l-1;i>l/2;i--)                b=b*10+str[i]-'0';            printf("%d\n",a+b*10);        }    }    return 0;}<span style="font-size:24px;"></span>

Digit

題目連結:

http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1227

當時比賽時,語言理解能力太差了,不知道數位是什麼意思,後來經隊友解釋,才知道是123456789101112...這些數一直排列下

去,然後讓你求第n個數,我頓時,就哭暈了。其實要解這題也不是很難,首先類比位元,找出是哪個位元,然後求解便可。

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;int main(){    int T,t=9;;    ll i,num[10],maxn[10];    num[1]=9;    maxn[1]=1;    for(i=2;i<10;i++)    {        t*=10;        num[i]=i*t+num[i-1];        maxn[i]=maxn[i-1]*10;    }    scanf("%d",&T);    while(T--)    {        ll n;        scanf("%lld",&n);        if(n<10)        {            printf("%lld\n",n);            continue;        }        ll pos=1;        for(i=1;i<10;i++)            if(num[i]>=n)            {                pos=i;                n-=num[i-1];                break;            }        int flag=0;        if(n%pos==0)            flag=-1;        long long ans=maxn[pos]+n/pos+flag;        for(i=0;i<pos;i++)        {            if((pos-i)%pos==n%pos)            {                printf("%lld\n",ans%10);                break;            }            ans/=10;        }    }    return 0;}

最小的數

題目連結:

http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1228

以前做過類似的題,不過沒說只能相鄰的交換。不過這題也不是很難。首先另開一個數組,從小到大排列,然後從首位依次遍曆(首位不能為0)與較小數交換,為什麼不說最小數呢,因為題目給了交換步數限制,所以你在有限步數內找到較小數然後交換,如果步數還有充裕的,則進行下一位操作,操作過程重複第一步即可。

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;int main(){    int T;    scanf("%d",&T);    while(T--)    {        char str[1010],tmp[1010];        int vis[1010];        int i,j,k,l,p,t1;        memset(vis,0,sizeof(vis));        scanf("%s%d",str,&k);        l=strlen(str);        strcpy(tmp,str);        sort(tmp,tmp+l);        for(i=0;i<l&&k;i++)        {            for(j=0;j<l;j++)            {                int flag=1;                if(vis[j]||tmp[j]>=str[i])                    continue;                if(!i&&tmp[j]=='0')                    continue;                for(p=i+1;p<l;p++)                {                    if(str[p]==tmp[j])                    {                        if(k<p-i)                            flag=0;                        else                        {                            k-=(p-i);                            for(t1=p;t1>i;t1--)                                swap(str[t1],str[t1-1]);                            vis[j]=1;                        }                        break;                    }                }                if(flag)                    break;            }            //cout<<str<<endl;            //cout<<k<<endl;        }        printf("%s\n",str);    }    return 0;}

煩人的異或

5.說實話,我還不知道這題怎麼做呢。先貼上別人的部落格,以後再更新。

http://www.cnblogs.com/zhengguiping--9876/p/4461329.html
6.Curious Maze 很蛋疼的一道題,這幾天忙著省賽,以後更新。

http://202.197.224.59/OnlineJudge2/index.php/Contest/read_problem/cid/38/pid/1230

人產生就 題目連結: http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1231

dp水題。先用dp找出最大數,然後再類比剛才的過程求出所有的路。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[510][510];int dp[510][510];int num[510][510];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        int i,j;        memset(dp,0,sizeof(dp));        memset(num,0,sizeof(num));        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)            {                scanf("%d",&a[i][j]);                dp[i][j]=max(dp[i][j-1],dp[i-1][j])+a[i][j];            }        }        num[1][1]=1;        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)            {                if(a[i][j]==dp[i][j]-dp[i][j-1])                    num[i][j]+=num[i][j-1];                if(a[i][j]==dp[i][j]-dp[i-1][j])                    num[i][j]+=num[i-1][j];                num[i][j]%=123456;            }        }        printf("%d\n",num[n][n]);    }    return 0;}

8.括弧匹配 題目連結: http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1232

stack的一個簡單運用,思想,我代碼裡的備忘已經很詳細了就不多說了。

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<stack>#include<map>#include<algorithm>using namespace std;struct node{    int index,x,y,r[4];//index表示它的序號,x表示它的屬性,y表示它的後序或前序,r[]依次代表小括弧,中括弧,大括弧}no[100010];int main(){    char str[100010];    int mm,x;    map<char,int> m;    stack<node> s;    m['(']=1;m['[']=2;m['{']=3;    m[')']=4;m[']']=5;m['}']=6;//用map存放括弧的屬性    while(scanf("%s",str+1)!=EOF)    {        memset(no,0,sizeof(no));        int i;        for(i=1;str[i];i++)        {            no[i].index=i;            no[i].x=m[str[i]];            if(m[str[i]]<=3)                s.push(no[i]);            else            {                node p,t;                p=s.top();                s.pop();                no[i].y=p.index;    //記錄它的前序                p.y=i;                if(s.size())                {                    t=s.top();                    s.pop();                    t.r[1]+=p.r[1];                    t.r[2]+=p.r[2];                    t.r[3]+=p.r[3];                    t.r[p.x]++;                    s.push(t);                }                no[p.index]=p;  //賦值前序            }        }        scanf("%d",&mm);        while(mm--)        {            scanf("%d",&x);            int j;            j=min(x,no[x].y);   //因為給出的x有可能是後序,所以要判斷            printf("%d %d %d %d\n",no[x].y,no[j].r[1],no[j].r[2],no[j].r[3]);        }        printf("\n");    }    return 0;}




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.