2019年暑假集訓第十三套題

問題 A: 軍訓方陣

題目描述

不知不覺軍訓已過半,又到了分方陣的時候,其中花樣方陣因爲其男女搭配作舞伴而廣受歡迎。花樣方陣最主要的就是變換陣型,並擺出精心設計的圖案。爲了簡化模型,假設n位同學處於方格中,
其中第?i名同學位於第xi行第yi列,現在需要進行變換,變換後第i名同學需要站在第ai行第bi列。在變換過程中所有人只能向上下左右四個方向,每秒移動一格,並且所有人的移動互不影響,即同一格子可以同時站下多人。
教官ctr想知道這次變換總共需要花費多少秒,你能告訴他嗎?

輸入

輸入第一行爲一個整數T(1 <=T <= 20),表示一共有T組測試數據。
對於每組測試數據:
第一行爲一個整數n(1<=n <= 100),表示方陣中有n名同學。
接下來的n行,每行爲4個整數xi,yi,ai,bi(1 <=xi,yi,ai,bi <= 1000),表示變換前和變換後的位置。

輸出

對於每組測試數據,輸出一個整數表示花費的時間。

樣例輸入

1
3
2 4 6 8
1 2 3 4
5 2 3 7

樣例輸出

8

題解:

c++語言基礎題!!!

源代碼:

#include<bits/stdc++.h>
using namespace std;
int s[105];
int main()
{
    int t;
    int x,y,a,b;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int maxx=-1;
        for(int i=1;i<=n;i++)
        {
            cin>>x>>y>>a>>b;
            s[i]=abs(a-x)+abs(b-y);
            maxx=max(maxx,s[i]);
        }
        cout<<maxx<<endl;
    }
} 

問題 B: 禮物

題目描述

cc最近收到了好多禮物,對着滿地大小不一的禮物,她想要一個包來裝,於是dd就掏出了一個會說話的神奇揹包給cc裝禮物。
cc爲了一次性裝儘可能多的禮物,於是跟這個揹包定下了一個規則,對每個禮物,揹包會給出它對這件禮物的喜愛程度,揹包越喜歡這個禮物,它就會越開心,越開心,它就會擴大自己的容量。
於是問題就變成了這樣:每個禮物都有自己的體積ai,揹包也會給出它對這些禮物的喜愛程度bi,並且爲了方便cc計算,揹包告訴cc,喜愛程度bi就是這件物體放進揹包,揹包後會擴大的體積。
那麼現在cc想知道,對這一地的禮物,有沒有某種放的順序,可以一次性把所有禮物都放進包裏?
當然,物體要先放進揹包,揹包纔會擴大自己的體積
比如當前揹包的剩餘體積爲2,禮物的體積爲3,喜愛程度爲4,也是不能放進揹包的。

輸入

輸入包含多組數據,第一行爲一個整數T(1<=T<=20)
每組數據第一行包含兩個整數n,v表示共有n個禮物,揹包一開始的體積爲v
接下去的n行每行包含兩個整數ai,bi表示每個禮物的體積ai與揹包對這件禮物的喜愛程度bi
1 <= T <= 20
1 <= n, v <= 100000
1 <= ai, bi <= 100000

輸出

若存在一種放禮物的順序可以讓cc把所有禮物放進揹包,則輸出"yes"否則輸出"no"(引號不包含在內)

樣例輸入

1
4 2
1 2
2 1
3 1
2 3

樣例輸出

yes

題解:

一道貪心題,先把能夠增加揹包空間的放進揹包,如果都能增加,那麼將

消耗揹包空間小的放進揹包,這樣就是揹包空間的最大值,最後判斷即可。

源代碼:

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int w,c;
}a[200005];
int v,n;
int cmp(node a,node b)
{
    if(a.c-a.w>=0&&b.c-b.w<=0)return 1;
    else if(a.c-a.w<0&&b.c-b.w>0)return 0;
    else return a.w<b.w;//若兩個都可以增加揹包空間
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>v;
        for(int i=1;i<=n;i++)cin>>a[i].w>>a[i].c;
        sort(a+1,a+1+n,cmp);
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            if(v-a[i].w<0)//不是v<0
            {
                flag=1;
                break;//注意break,不然會TLE
            }
            v=v-a[i].w+a[i].c;
        }
        if(flag==1)cout<<"no"<<endl;
        else cout<<"yes"<<endl;
    }
}

問題 C: 發題目3

題目描述

陳老師今天心情很好,所以他又想給他的學生髮題目了,陳老師囤積了很多很好的題目,每一題都有一個唯一的編號,但是存題目的U盤被陳老師弄丟了,好在陳老師把所有題目都打印了出來,每一題都分別打印在不同的紙上,可惜的是每一題都只打印了一份。  

由於題目難度不同,適合做的學生也不一樣,所以陳老師不想把題目隨便發給學生,他找你來幫忙把題目分發給學生,陳老師會給你一些指令,你只需要按照陳老師給的指令把某一題發給某一個學生就行了。  

但是由於題目是在太多了,陳老師記性又不好,有時候會把某一道之前已經給別人的題再讓你給某一位學生,這時候你要像陳老師報告,告訴陳老師這題之前已經給了哪個學生。 

最後,陳老師想知道每個學生分別分到了多少題,希望你能幫他統計一下。 

輸入

輸入文件爲“ti.in” 
輸入第一行爲兩個正整數n和m,分別表示陳老師學生的數量(學生按照1到n編號)和陳老師給你的指令的數量 

接下來m行每行有兩個正整數a和b,表示一個指令,含義爲把編號爲b的題目發給編號爲a的學生。 

輸出

輸出文件爲“ti.out” 
對於每一個指令,如果要發的題目之前已經發給某個學生了(包括自己),請輸出兩個用空格隔開的整數分別表示這題的編號和獲得這題的學生的編號,並換行;否則不輸出。 

處理完所有指令後,請在最後一行輸出n個用空格隔開的正整數,第i個整數表示編號爲i的學生分到的題目的數量 

(注意:由於每道題目都只有一份,所以一道題如果已經給了某個學生,那麼只有該學生擁有這道題,別人無法再得到它,該學生也只能得到一份這道題目,即如果有多個指令把同一道題給同一個學生,該學生只能得到一份該題目) 

樣例輸入

3 5
1 1
1 1
3 2
2 1
2 2

樣例輸出

1 1
1 1
2 3
1 0 1

提示

【樣例解釋】 

一號學生分到了編號爲1的題,給2號學生的題都已經先行給了別人,所以2號沒有分到題目,3號學生分到了編號爲2的題 

【數據範圍】 

對於50%的數據,1 <= n, m <= 10, 1 <= 題目編號 <= 10
對於100%的數據,1 <= n <= 10, 1 <= m <= 100000, 題目編號爲int範圍內正整數 

不是AC的題解:

這題我只會暴力,結果TLE,50分

先貼上:

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int a,b;
    int s;
}s[100005],sum[105];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        cin>>s[i].a>>s[i].b;
    int flag=0;
    memset(sum,0,sizeof(sum));
    int t;
    for(int i=1;i<=m;i++)
    {
        flag=0;
        t=s[i].a;
        for(int j=1;j<i;j++)
        {
            if(s[j].b==s[i].b)
            {
                cout<<s[j].b<<" "<<s[j].a<<endl;
                //system("pause");
                //cout<<j<<" ";
                flag=1;
                break;
            }
        }
        if(flag==0)sum[t].s++;
    }
    for(int i=1;i<=n;i++)cout<<sum[i].s<<" ";
}

 

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