大學生程序設計邀請賽(華東師範大學)

C. 袋鼠媽媽找孩子

Time limit per test: 1.5 seconds

Memory limit: 256 megabytes

Accept / Submit: 41 / 172

袋鼠媽媽找不到她的孩子了。她的孩子被怪獸抓走了。

袋鼠媽媽現在在地圖的左上角,她的孩子在地圖第 x 行第 y 列的位置。怪獸想和袋鼠媽媽玩一個遊戲:他不想讓袋鼠媽媽過快地找到她的孩子。袋鼠媽媽每秒鐘可以向上下左右四個方向跳一格(如果沒有牆阻攔的話),怪獸就要在一些格子中造牆,從而完成一個迷宮,使得袋鼠媽媽能夠找到她的孩子,但最快不能小於 k 秒。

請設計這樣一個迷宮。

Input

第一行兩個整數 n,m (1n,m8),表示地圖的總行數和總列數。

第二行三個整數 x,y,k (1xn,1ym,x+y>1)

Output

輸出一個地圖,應正好 n 行 m 列。

用 . 表示空地,用 * 表示牆。袋鼠媽媽所在的位置和孩子所在的位置用 . 表示。

數據保證有解。

Examples

input
2 6
1 3 4
output
.*.***
......
比賽鏈接:http://acm.ecnu.edu.cn/contest/11/

題目鏈接:http://acm.ecnu.edu.cn/problem/3260/

AC代碼:

/**
  * 行有餘力,則來刷題!
  * 博客鏈接:http://blog.csdn.net/hurmishine
  *
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=10;
char a[maxn][maxn];

int dir[4][2]= {1,0,0,1,-1,0,0,-1};
int n,m;
int ex,ey,T;

bool DFS(int x,int y,int t)//當前位置,所用時間
{
    if(x==1&&y==1)
        return t>=T;
    for(int i=0; i<4; i++)
    {
        int xx=x+dir[i][0];
        int yy=y+dir[i][1];
        if(!xx||!yy||xx>n||yy>m||a[xx][yy]!='*')
            continue;
        int cnt=0;
        //(xx,yy)這個點只能由(x,y)到達
        for(int j=0;j<4;j++)
        {
            int u=xx+dir[j][0];
            int v=yy+dir[j][1];
            if(a[u][v]=='.')
                cnt++;
        }
        if(cnt>1)
            continue;
        a[xx][yy]='.';
        if(DFS(xx,yy,t+1))
            return true;
        a[xx][yy]='*';
    }
    return false;
}
int main()
{
    //freopen("C:\\Documents and Settings\\Administrator\\桌面\\data.txt","r",stdin);
    while(cin>>n>>m)
    {
        cin>>ex>>ey>>T;
        memset(a,'*',sizeof(a));
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=m;j++)
                a[i][j]='*';
        }
        a[ex][ey]='.';
        DFS(ex,ey,0);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                cout<<a[i][j];
            cout<<endl;
        }
    }
    return 0;
}

E. 黑心啤酒廠

Time limit per test: 1.0 seconds

Memory limit: 256 megabytes

Accept / Submit: 1184 / 4093

黑心啤酒廠爲了讓大家買啤酒,會把一瓶酒設計成恰好能倒七杯。由於聚會時經常會有大家一起幹杯這樣的事情,乾杯之前又要給每個人都倒滿,所以來兩個人的時候,幹完三輪,恰好多一杯;三個人的時候,幹完兩輪,恰好多一杯;四個人的時候會多三杯。在上述情況下,爲了踐行不浪費的原則,就會多買一瓶啤酒,再幹一輪。當然多買的啤酒可能又有多了……然後循環往復,喝了好多好多。直到啤酒剛剛好喝完爲止。

現在啤酒廠把酒瓶設計成剛好能倒 x 杯,請依次求出有 2 人、3 人,一直到 n 人蔘加聚會時,啤酒廠各能賣出多少瓶啤酒。

Input

輸入只有一行,兩個整數 x,n (1x109,2n105)

Output

輸出 n1 行,分別表示 2,3,,n 人蔘加聚會時,能賣出的啤酒瓶數。

Examples

input
7 5
output
2
3
4
5
原題鏈接:http://acm.ecnu.edu.cn/problem/3262/

暴力枚舉肯定超時,簡單用數學知識推一下就可以了.

假設需要k瓶,則

kx%n=0

-->gcd=GCD(x,n)

-->k=x/gcd*n/x

計算xn的最小公倍數,就是這些人至少需要喝幾杯,最小公倍數除以ixx就是要買幾瓶。

AC代碼:

**
  * 行有餘力,則來刷題!
  * 博客鏈接:http://blog.csdn.net/hurmishine
  *
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=0;
typedef long long LL;
LL GCD(LL x,LL y)
{
    if(y==0)
        return x;
    return GCD(y,x%y);
}
int main()
{
    //freopen("C:\\Documents and Settings\\Administrator\\桌面\\data.txt","r",stdin);

    LL x,n;
    while(cin>>x>>n)
    {
        for(LL y=2; y<=n; y++)
        {
            LL gcd=GCD(x,y);
            cout<<x/gcd*y/x<<endl;
        }
    }
    return 0;
}

F. 麗娃河的狼人傳說

Time limit per test: 1.0 seconds

Memory limit: 256 megabytes

Accept / Submit: 224 / 1759

麗娃河是華師大著名的風景線。但由於學校財政緊缺,麗娃河邊的路燈年久失修,一到晚上就會出現走在河邊要打着手電的情況,不僅非常不方便,而且影響安全:已經發生了大大小小的事故多起。

方便起見,麗娃河可以看成是從 1 到 n 的一條數軸。爲了美觀,路燈只能安裝在整數點上,每個整數點只能安裝一盞路燈。經專業勘測,有 m 個區間特別容易發生事故,所以至少要安裝一定數量的路燈,

請問至少還要安裝多少路燈。

Input

第一行一個整數 T (1T300),表示測試數據組數。

對於每組數據:

  • 第一行三個整數 n,m,k (1n103,1m103,1kn)

  • 第二行 k 個不同的整數用空格隔開,表示這些位置一開始就有路燈。

  • 接下來 m 行表示約束條件。第 i 行三個整數 li,ri,ti 表示:第 i 個區間 [li,ri] 至少要安裝 ti 盞路燈 (1lirin,1tin)

Output

對於每組數據,輸出 Case x: y。其中 x 表示測試數據編號(從 1 開始),y 表示至少要安裝的路燈數目。如果無解,y 爲 1

Examples

input
3
5 1 3
1 3 5
2 3 2
5 2 3
1 3 5
2 3 2
3 5 3
5 2 3
1 3 5
2 3 2
4 5 1
output
Case 1: 1
Case 2: 2
Case 3: 1

Note

因爲今天不是滿月,所以狼人沒有出現。

原題鏈接:http://acm.ecnu.edu.cn/problem/3263/

暴力貪心可以過,當然也有更好的方法.

AC代碼:

/**
  * 行有餘力,則來刷題!
  * 博客鏈接:http://blog.csdn.net/hurmishine
  *
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e3+5;
int n,m,k;
struct Node
{
    int l,r,s;
}a[maxn];
bool vis[maxn];
bool cmp(Node x,Node y)
{
    return x.r<y.r;
}
int solve()
{
    int ans=0;
    for(int i=0;i<m;i++)
    {
        if(a[i].r-a[i].l+1<a[i].s)
            return -1;
        int cnt=0;
        for(int j=a[i].l;j<=a[i].r;j++)
            cnt+=vis[j];
        if(cnt>=a[i].s)
            continue;
        for(int j=a[i].r;j>=a[i].l;j--)
        {
            if(!vis[j])
            {
                vis[j]=true;
                cnt++;
                ans++;
                if(cnt==a[i].s)
                    break;
            }
        }
    }
    return ans;
}
int main()
{
    //freopen("C:\\Documents and Settings\\Administrator\\桌面\\data.txt","r",stdin);
    int T,kase=0;
    cin>>T;
    while(T--)
    {
        cin>>n>>m>>k;
        int x;
        memset(vis,false,sizeof(vis));
        for(int i=0;i<k;i++)
        {
            cin>>x;
            vis[x]=true;
        }
        int l,r,k;
        for(int i=0;i<m;i++)
        {
            cin>>l>>r>>k;
            a[i]=Node{l,r,k};
        }
        sort(a,a+m,cmp);

        printf("Case %d: %d\n",++kase,solve());
    }
    return 0;
}

G. 鐵路修復計劃

Time limit per test: 2.0 seconds

Memory limit: 256 megabytes

Accept / Submit: 146 / 1219

在 A 國有很多城際鐵路。這些鐵路都連接兩個城市(城市從 1 到 n 編號),可以雙向通行,使得任意兩個城市之間都由鐵路網聯繫起來。

不過在一次星球大戰之後,所有的鐵路都經歷了不同程度的損傷以至於無法通行了。由於經費緊缺,A 國政府不願意再出資造新的鐵路。對於原有的城際鐵路,根據鐵路的實際情況,有以下兩種處理辦法:

  1. 使用國內技術進行修復:主要針對損壞情況不是很嚴重的鐵路。國內公司會對鐵路狀況進行評估,然後如實開出鐵路修復的費用。
  2. 使用國外技術進行修復:主要針對損壞情況嚴重的鐵路。國外公司也會對鐵路情況進行評估,然後按照鐵路實際修復費用的 k 倍來收費(其中 k 是一個由國外公司決定的實數,不管怎麼說,優惠是不可能的,所以 k1)。

A國政府修復鐵路的總預算是 M,目標是要讓任意兩個城市之間都能通過鐵路聯繫起來。在預算不夠且能夠完成目標的條件下,顯然沒必要修復每一條鐵路。

國外公司通過不知什麼途徑瞭解到了 A 國政府的總預算 M,他們現在要把 k 定下來,並且希望 k 儘可能得大。但 k 又不能太大,不然,如果 A 國政府發現無法完成任務的話,整個訂單都會泡湯。

Input

測試數據包含不超過 30 個測試文件。每個測試文件是單個測試點。

第一行是三個整數 n,m,M (2n105,n1mmin{105,n(n1)2},1M1015)

接下來 m 行,每行四個整數 ui,vi,ti,fi。表示一條城際鐵路,連接着 ui 和 vi 城市,ti 表示鐵路實際修復費用。fi=1 表示只能由國外公司修復,fi=0 表示由國內公司修復。(1ui,vin,uivi,1ti106,fi{0,1})。輸入保證兩個城市之間不會存在多條鐵路。

輸入保證:

  • 在國外公司不亂收費 (k=1) 的情況下,使用預算能完成要求。
  • 完全不使用國外技術,只使用國內技術,是不能完成目標的。

Output

求 k 的最大值。輸出答案與標準答案相差不超過 106 即判爲正確。

Examples

input
3 3 9
1 2 1 1
1 3 2 0
2 3 1 1
output
7.000000
input
3 3 9
1 2 1 1
1 3 2 1
2 3 2 1
output
3.000000
原題鏈接:http://acm.ecnu.edu.cn/problem/3247/


二分就可以了,

AC代碼:

/**
  * 行有餘力,則來刷題!
  * 博客鏈接:http://blog.csdn.net/hurmishine
  *
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100005;//1e5+5;
int n,m;
double M,k;
struct Node
{
    int u,v,f;
    double w;
}a[maxn];
int fa[maxn];
int Find(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=Find(fa[x]);
}
bool cmp(Node &a,Node &b)
{
    double x,y;
    if(a.f)
        x=a.w*k;
    else
        x=a.w;
    if(b.f)
        y=b.w*k;
    else
        y=b.w;
    return x<y;
}

bool OK()
{
    for(int i=0;i<=n;i++)
        fa[i]=i;
    sort(a+1,a+1+m,cmp);
    double sum=0;
    int cnt=0;
    for(int i=1;i<=m;i++)
    {
        int fu=Find(a[i].u);
        int fv=Find(a[i].v);
        if(fu==fv)
            continue;
        fa[fu]=fv;
        if(a[i].f)
            sum+=a[i].w*k;
        else
            sum+=a[i].w;

        if(++cnt==n-1)
            break;
    }
    return sum<=M;

}
int main()
{
    //freopen("C:\\Documents and Settings\\Administrator\\桌面\\data.txt","r",stdin);
    while(cin>>n>>m>>M)
    {
        double minn=100000000;//1e5;
        for(int i=1;i<=m;i++)
        {
            //cin>>a[i].u>>a[i].v>>a[i].w>>a[i].f;
            scanf("%d%d%lf%d",&a[i].u,&a[i].v,&a[i].w,&a[i].f);
            if(a[i].f)
                minn=min(a[i].w,minn);
        }
        double l=1,r=M/minn;
        while(fabs(r-l)>1e-6)
        {
            //cout<<l<<","<<r<<endl;
            double mid = (l+r)/2;
            k=mid;
            if(OK())
                l=mid;
            else
                r=mid;
        }
        printf("%.6f\n",l);
    }
    return 0;
}


剩下的題,隨緣吧.






發佈了374 篇原創文章 · 獲贊 211 · 訪問量 70萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章