1. 程式人生 > >13.4.7周賽解題報告

13.4.7周賽解題報告

第一題,開始被輸出嚇著了,仔細看,水題一道,dfs即可啊

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int p[25][5];
bool v[25];
int m,a,num;
int f[25];
void go(int x,int n)
{
    v[x]=1;
    f[n]=x;
    if(n==20&&(p[x][1]==m||p[x][2]==m||p[x][3]==m))
    {
        cout<<num++<<": ";
        for(int i=1;i<=20;i++)cout<<" "<<f[i];
        cout<<" "<<m<<endl;
    }
    else
    {
        for(int i=1;i<=3;i++)
        {
            if(v[p[x][i]]==0)go(p[x][i],n+1);
        }
    }
    v[x]=0;
}
int main()
{
    for(int i=1;i<=20;i++)
    {
        for(int j=1;j<=3;j++)
        {
            scanf("%d",&a);
            p[i][j]=a;
        }
    }
    while(scanf("%d",&m)&&m)
    {
        num=1;
        memset(v,0,sizeof(v));
        go(m,1);
    }
    return 0;
}

第二和第三題,都是dfs的基礎題,沒什麼可講的。

第四題,函式本身是單調遞增的,先確定無解的情況,有解的話再找解。我是先確定大概整數範圍,再小範圍的找解,這題在精度上吃虧了。。。。。wa了好久

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
double y;
double s(double x)
{
    return 8.0*pow(x,4)+7.0*pow(x,3)+2.0*pow(x,2)+3.0*x+6.0;
}
double find()
{
    for(double i=0;i<=100;i++)
    {
        if(s(i)>=y)return (i-1.0);
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf",&y);
        if(y<6||s(100.0)<y)
        {
            cout<<"No solution!"<<endl;

            continue;
        }
        if(y==6)
        {
            cout<<"0.0000"<<endl;
            continue;
        }
        double l=find();
        while(l<=100)
        {
            if(s(l)>=y)
            {
                printf("%.4f\n",l);
                break;
            }
            l+=0.000001;
        }
    }
    return 0;
}


第五題,嗯,有點難度啊,向朱老闆請教才得以ac。基本思路就是二進位制列舉+位運算。這裡先要做一個預處理,我設了個p[][]陣列,將num題的所有情況存在p[num]中,然後二分題數,在p中找到符合的情況。

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1<<15
using namespace std;
int n,m,k,f[1005],num,ti,ans;
int p[17][33000],c[16];
char name[50];
int er(int i)
{
    int nnn=0;
    int j = i;
    while(j>0)
    {
        nnn+=j%2;
        j=j/2;
    }
    return nnn;
}
int main()
{
    memset(c,0,sizeof(c));
    for(int i=0;i<=32768;i++)
    {
        int a=er(i);
        p[a][c[a]]=i;
        c[a]++;
    }
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        memset(f,0,4*(n+1));
        for(int i=0;i<n;i++)
        {
            scanf("%s%d",&name,&num);
            for(int j=0;j<num;j++)
            {
                scanf("%d",&ti);
                f[i]+=1<<(ti-1);
            }
        }
        ans=0;
        int high=m,low=0,mid,count;
        while(low<=high)
        {
            mid=(low+high)/2;
            for(int i=0;i<c[mid];i++)
            {
                count=0;
                for(int j=0;j<n;j++)
                {
                    if((f[j]&p[mid][i])==p[mid][i])count++;
                }
                if(count>=k)
                {
                    if(er(p[mid][i])>ans)ans=er(p[mid][i]);
                    ans=mid;
                    low=mid+1;
                    break;
                }
            }
            if(low<=mid)high=mid-1;
        }
        cout<<ans<<endl;
    }
    return 0;
}

第六題,二分時間,子彈反正都是讓它最遠距離,看mid時間內能否結束狩獵。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
double x,y,x2,y2,lx,ly,vd,vb,l;
int main()
{
    while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf",&x,&y,&x2,&y2,&lx,&ly,&vd,&vb,&l)&&(x||y||x2||y2||lx||ly||vd||vb||l))
    {
        double high=1e+9,low=0,mid,len,t=l/vb,ans=1e+9;
        while(high-low>0.00000001)
        {
            mid=(low+high)/2;
            len=sqrt((x2-x-lx*mid)*(x2-x-lx*mid)+(y2-y-ly*mid)*(y2-y-ly*mid));
            if((mid-t)*vd>=fabs(len - l))
            {
                high=mid;
                if(mid<ans)ans=mid;
            }
            else low=mid;
        }
        printf("%.3f %.3f\n",l,ans);
    }
    return 0;
}

第七題,三分題,先確定體積表示式,再三分高度,得到最小體積時的半徑和高。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int t,n;
double x[10005],y[10005],r,l,mid,mmid,ra,rra,a,b;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        l=0;
        for(int i=0;i<n;i++)
        {
            scanf("%lf%lf%lf",&a,&b,&y[i]);
            if(y[i]>l)l=y[i];
            x[i]=sqrt(a*a+b*b);
        }
        r=30000;
        while(r-l>0.0000000001)
        {
            mid=(l+r)/2;
            mmid=(mid+r)/2;
            ra=0;
            rra=0;
            for(int i=0;i<n;i++)
            {
                if(x[i]*mid/(mid-y[i])>ra)ra=x[i]*mid/(mid-y[i]);
                if(x[i]*mmid/(mmid-y[i])>rra)rra=x[i]*mmid/(mmid-y[i]);
            }
            if(ra*ra*mid>rra*rra*mmid)l=mid;
            else r=mmid;
        }
        printf("%.3f %.3f\n",l,ra);
    }
    return 0;
}

第八題,一開始以為是數學問題,但居然也是三分。。。。這裡可以三分轉過的角度,然後假設車的左側中間頂在角上,右後頂在牆上,算出凸出的長度,去最大的和y比較,從而判斷能否過彎。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define pi 3.1415926535898
using namespace std;
double x,y,l,w,r,lo,mid,mmid,m,mm,ans;
int main()
{
    while(scanf("%lf%lf%lf%lf",&x,&y,&l,&w)!=EOF)
    {
        ans=0;
        r=pi/2;
        lo=0;
        while(r-lo>0.000000001)
        {
            mid=(lo+r)/2;
            mmid=(mid+lo)/2;
            m=cos(mid)*(l-(x-w*cos(mid))/sin(mid))+w*sin(mid);
            mm=cos(mmid)*(l-(x-w*cos(mmid))/sin(mmid))+w*sin(mmid);
            ans=max(ans,max(m,mm));
            if(m<mm)r=mid;
            else lo=mmid;
        }
        if(ans>y)printf("no\n");
        else printf("yes\n");
    }
    return 0;
}

第九題,也是三分,三分x,找出各函式的y值取最大的那個,然後找到所以x的時候這些最大值中最小的那個。
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1<<29
using namespace std;
double a[10005],b[10005],c[10005];
int n,t;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
        double r=1000,l=0,mid,mmid,m,ma,mm,mma;
        double ans = maxn;
        while(r-l>0.000000001)
        {
            mid=(r+l)/2;
            mmid=(r+mid)/2;
            m=-maxn;
            mm=-maxn;
            for(int i=0;i<n;i++)
            {
                ma=a[i]*mid*mid+b[i]*mid+c[i];
                mma=a[i]*mmid*mmid+b[i]*mmid+c[i];
                if(ma>m)m=ma;
                if(mma>mm)mm=mma;
            }
            ans = min(m,mm);
            if(m>mm)l=mid;
            else r=mmid;
        }
        printf("%.4f\n",ans);
    }
    return 0;
}

第十題,=。=!!!!再說吧,有難度啊。。。

相關推薦

13.4.7解題報告

第一題,開始被輸出嚇著了,仔細看,水題一道,dfs即可啊 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int p[25][5]; b

Leetcode 第136場解題報告

週日的比賽的時候正在外面辦事,沒有參加。賽後看了下題目,幾道題除了表面要考的內容,還是有些能發散擴充套件的地方。 做題目不是最終目的,通過做題發現知識盲區,去研究學習,才能不斷提高。 理論和實際是有關係的,一些題目也都有現實意義。計算機的一些模擬操作,通過數學演算法,能夠大大減輕程式碼量和演算法複雜度。 第一

Leetcode 第137場解題報告

今天的比賽的題目相對來說比較「直白」,不像前幾周都是一些特定的演算法,如果你沒學過不可能想出來。 做了這些周,對leetcode比賽的題目也發現了一些「規律」。 一般前兩道題都很「簡單」,只要有想法,直接敲程式碼就能解出來。更多考察的是結果是否正確,速度其次。 後兩道題有些難度 ,不同場次難度不一樣,也可能和

2015-9-13 NOIP模擬解題報告(by hzwer)

++ ron 解題報告 正整數 max 決策 pty uri 由於 小奇挖礦 「題目背景」 小奇要開采一些礦物,它駕駛著一臺帶有鉆頭(初始能力值w)的飛船,按既定路線依次飛過喵星系的n個星球。 「問題描述」 星球分為2類:資源型和維修型。 1.資源型:含礦物質量a[i],若

歡樂解題報告

輸入 不同 eof ~~ ostream 同步 題目 由於 .cpp ~~一場不歡樂的歡樂賽 時間分配::T1做的時候還可以,大約三十分鐘寫了個深搜(鬼知道我為啥不用廣搜,大概是因為快半個月沒寫了)寫完後去研究第二題,剛開始以為是貪心,很快寫了出來,但是自己推了一會舉出了反

NOI 2015 滯後解題報告

operator scrip emc void long 存在 truct append asc 報同步賽的時候出了些意外。於是僅僅能做一做“滯後賽”了2333 DAY1 T1離線+離散化搞,對於相等的部分直接並查集,不等部分查看是否在同一並查集中就

2018.10.6 NOIP模擬解題報告

報告 pan 期望 spa mat 分情況討論 。。 都是 數據 心路歷程 預計得分:\(100 + 100 + 20 = 220\) 實際得分:\(100 + 100 + 30 = 230\) 辣雞模擬賽。。 T1T2都是一眼題,T3考驗卡常數還只有一檔暴力分。 開場發現

洛谷十一月月解題報告

比賽地址:https://www.luogu.org/contestnew/show/12006 唉,T3考試的時候zz了,把式子寫錯了。。。。結果只有30分啊,然後T4連10分都沒騙到。雖然身為蒟蒻但實在有點自閉了,只好來發篇解題報告。。。qwq T1 P4994 終於結束的起點 就是簡單的模擬,不說了

2018.10.03 NOI+模擬 解題報告

得分: 30+5+0=3530+5+0=3530+5+0=35(考得真不咋滴) T1T1T1:奧義商店(點此看題面) 以為很簡單,對著這題想了一個多小時,最後果斷打了個暴力交了… … 看完題解發現其實

2018.10.26 NOIP2018模擬 解題報告

得分: 0+10+100+10+100+10+10(T1T1T1死於假題面,T3T3T3死於細節… …) P.S.P.S.P.S.由於原題是圖片,所以我沒有上傳題目描述,只有資料。 T1T1T1:顏料

2014 第六屆藍橋杯校內解題報告 答案

僅僅留做以後回過頭來勉勵自己,轉載請註明出處。1. 輸入一個字串,求它包含多少個單詞。單詞間以一個或者多個空格分開。 第一個單詞前,最後一個單詞後也可能有0到多個空格。 比如:" abc    xyz" 包含兩個單詞,"ab   c   xyz    "  包含3個單詞。

11.7NOIP模擬解題報告

心路歷程 預計得分:\(50 + 100 + 100\) 實際得分:\(50 + 100 +100\) T2 T3兩道資料結構題美滋滋,然而寫完就過去\(3h\)美滋滋 T1數學題學弟們都會做Orzzz 還是太菜了qwq Sol T1 設\(g = gcd(n, m, k)\),判斷給出的數在模\(g\)的意

11.6NOIP模擬解題報告

心路歷程 預計得分:\(100 + 100 + 100 = 300\) 實際得分:\(100 +100 +100 = 300\) 學OI兩年終於AK了一次qwq(雖然題目炒雞水。。) 紀念一下這令人激動的時刻。。 8點開始考,9:40就都拍上了。。可見題目確實水。。然後又去做了做另一套 Sol T1 題目中

11.5NOIP模擬解題報告

心路歷程 預計得分:\(100 + 40 + 30 = 170\) 實際得分:\(100 +100 + 50 = 250\) 辣雞資料毀我青春 T1一眼不會做感覺要涼 T2好像一波折半搜尋就做完了 T3好像是神仙題不會做。。 打完T1暴力後去淦T2,結果最後在排序的時候把greater<LL>()

暑假第四次考試 沖刺Noip模擬4 解題報告——五十嵐芒果醬

空格 註意 工程 tin tex app als family 如果 題1 韜韜搶蘋果(apple) 【問題描述】 又到了收獲的季節,樹上結了許多韜韜,錯了,是許多蘋果,有很多個小韜韜都來摘蘋 果。每個韜韜都想要最大的蘋果,所以發生了爭執,為了解決他們的矛盾,出題人定了

2018.7.21NOIP模擬解題報告

algo racket vector i++ lin 答案 替換 搜索 我們 題面 預計得分:70 + 60 + 30 = 160 實際得分:40 + 60 + 0 = 100 T1數組開小了 T2比賽結束後5min AC T3加了個記憶話搜索wa了、、

nowcoder OI 最後的晚餐(dinner) 解題報告

lld cst acs return 通過 .com ++ tro put 最後的晚餐(dinner) 鏈接: https://www.nowcoder.com/acm/contest/219/B 來源:牛客網 題目描述 \(\tt{**YZ}\)(已被和諧)的食堂實在是太

leetCode106解題報告 javascript

比賽地址: https://leetcode-cn.com/contest/weekly-contest-106 922. 按奇偶排序陣列 II 922. Sort Array By Parity II 給定一個非負整數陣列 A, A 中一半整數是奇數,一半整數是偶數。 對陣列進行排序,以

PAT (解題報告7-4 求字首表示式的值 (25 分)

算術表示式有字首表示法、中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2+3*(7-4)+8/4的字首表示式是:+ + 2 * 3 - 7 4 / 8 4。請設計程式計算字首表示式的結果值。 輸入格式: 輸入在一行內給出不超過30個字元的字首

沖刺Noip2017模擬8 解題報告——五十嵐芒果醬

.cn 其中 www. tex 我不 closed 必須 std -s 1、鼎紋 【問題描述】 據說鼎紋的 種制造 式是 銅模印出來的,這是我國古代勞動 智慧 的結晶。銅模印過的地 ,會留下深深的印記,經過時間的煉化,洗 練成歷史的遺存。 聰明的古代勞動人民擁有一個 a