1. 程式人生 > >【蒻爆了的NOIP系列--普及組複賽】(4)NOIP2013普及組複賽題解

【蒻爆了的NOIP系列--普及組複賽】(4)NOIP2013普及組複賽題解

這只是一個作業,如果有幫到您的,我只能說。。。這不科學。。。
————————————華麗的分割線————————————
第一題:
第一題題目-第1頁
神似noip2016t1…
貌似就資料範圍和輸入方式變了,要搜的數變成變量了嗎。。。
不講了自己看2010去。。。(等下!!!這句話刪掉!!!)
不過。。。這道題並沒有這麼easy。。。
我們要考慮要搜的數為0的情況。。。
突然發現(高階演算法)把我搞悶逼了。。。
所以我用的是低階演算法。。。
不過也要特判一下,,,
具體看程式碼。。。

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream> #include <cstring> #include <ctime> #include <algorithm> #include <queue> #include <map> #define ci const int #define ri register int #define ll long long #define reg register #define boom return #define cmax(a,b) (a)>(b)?(a):(b) #define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=a;i<b;i++) using namespace std; int l,r,ans,z; int main() { int i,j; scanf("%d%d",&l,&r); for(i=0;i<=l;i++) { z=i; for(j=0;j<10;j++)ans+=(z%10==r)&&z,z/=10; } printf("%d",ans); boom 0; } //沒有什麼是兩個巴掌不能解決的,如果有就再來兩個巴掌

————————————華麗的分割線————————————
第二題:
第二題題目-第1頁
第二題題目-第2頁
首先這道題的算式一定是由很多個數與一些數的乘積組成的,於是我們可以遇到數字就存到一個變數裡,遇到乘號就記一個值,在遇到下一個符號後把兩個數相乘,遇到加號就把變數的值加進答案裡。
程式如下:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <queue>
#include <map>
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=a;i<b;i++)
using namespace std;

char a;
int add;
bool op=0;
int main()
{
    int i=0,j=0;

    while(a=getchar(),a!='\n')
    {
        switch(a)           
        {
            case '+':if(op)i=(i*j)%10000,j=0;op=0,add=(add+i)%10000,i=0;break;
            case '*':if(op)i=(i*j)%10000,j=0;op=1,j=i,i=0;break;
            default:i=(i*10+a-'0')%10000;
        }
    }
    if(op)i*=j;
    add+=i;
    printf("%d",add%10000);
    return 0; 
}
//沒有什麼是兩個巴掌不能解決的,如果有就再來兩個巴掌

注意如果最後不mod只有30分(太噁心了吧)
————————————華麗的分割線————————————
第三題:
第三題題目-第1頁
第三題題目-第2頁
小盆友的數字。。。
這道題正解不開longlong50分,開了80,加個小技巧AC
首先我們發現特徵值為最大子段和沒意見吧qwq。
然後我們繼續分析分數。。。
會機智的發現因為特徵值是單調遞增的所以分以下情況:
1。如果他的前一個小朋友的特徵值大於0,那麼說明前面特徵值是正的,那最大特徵值就是左邊的小屁孩了,分數=前一個小朋友的分數+前一個小朋友的特徵值,更新當前最大值。
2。如果他的前一個小朋友的特徵值小於0,那說明什麼?說明前面小盆友的特徵值都是負的,不難發現他的分數=第二個小朋友的分數。
Q:小技巧是什麼
A:看【論小技巧的自我修養】(1)論模的優化
程式碼

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <queue>
#include <map>
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=a;i<b;i++)
using namespace std;

const ll MAXN=1000086;
struct chi
{
    ll nu,fea,poi;
}a[MAXN];
ll n,Mod,ans,maxx,maxnow[MAXN],pd;
int main()
{
    ll i;

    scanf("%lld%lld",&n,&Mod);
    for(i=1;i<=n;i++)scanf("%lld",&a[i].nu);
    maxnow[1]=a[1].fea=a[1].poi=a[1].nu;
    pd=(a[1].nu>=0),maxx=a[2].poi=a[1].nu*2;
    for(i=2;i<=n;i++)
    {
        a[i].fea=cmax(a[i-1].fea+a[i].nu,a[i].nu);
        maxnow[i]=cmax(maxnow[i-1],a[i].fea);
    }
    for(i=3;i<=n;i++)
        if(maxnow[i-1]>=0)
        {
            a[i].poi=a[i-1].poi+maxnow[i-1];
            if(a[i].poi>a[1].poi)pd=1;
            if(a[i].poi>1000000000)a[i].poi%=Mod;
        }
        else a[i].poi=a[2].poi;
    ans=(pd?a[n].poi:a[1].poi)%Mod;
    printf("%lld",ans);
    return 0; 
}
//沒有什麼是兩個巴掌不能解決的,如果有就再來兩個巴掌

————————————華麗的分割線————————————
第四題:
第四題題目-第1頁
第四題題目-第2頁
第四題題目-第3頁
嗯。。。第4題。。。
引用我的題解qwq

首先我們看輸入,每一趟火車給我們的關係是什麼?拿樣例來說,4 1 3 5 6。就是1,3,5,6一定比2,4來的大。
於是,我們把1,3,5,6各向2,4連邊。記在一個鄰接矩陣裡。
全部輸入完以後,就可以亂搞(等等,這個詞刪掉)寫正解了。
此時,沒有入邊的點都是啥?當然是最大的了。為了讓級數最少,我們把它們都當做同一個級別的,刪掉,答案++。
然後,再找下一個級別的車站。
就這樣找呀找,找完所有的車站,程式結束~~~
重新審視演算法,這不就是拓撲嗎2333333333333333333333333333333333333
程式碼醬如下:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <queue>
#include <map>
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=a;i<b;i++)
using namespace std;

ci MAXN=1086;
int in[MAXN],al[MAXN][MAXN],a[MAXN][MAXN],minn=2147483647,maxx=-2147483647,n,m; 
int tsort()
{
    int i,j,ans=0,del=0,de[MAXN]={0},d[MAXN]={0};
    while(++ans)
    {
        for(i=minn;i<=maxx;i++)
        {
            if(!de[i]&&!in[i]&&d[i]!=ans)
            {
                for(j=minn;j<=maxx;j++)
                if(al[i][j])al[i][j]--,in[j]--,d[j]=ans;
                del++,de[i]=1;
            }
        }
        if(del>maxx-minn)return ans;
    }
}
int main()
{
    int i,j,k,b[MAXN];

    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        memset(b,0,sizeof(b));
        scanf("%d",&a[i][0]);
        for(j=1;j<=a[i][0];j++)scanf("%d",&a[i][j]),b[a[i][j]]++;
        for(j=a[i][1];j<=a[i][a[i][0]];j++)
        {
            if(!b[j])for(k=1;k<=a[i][0];k++)
            if(!al[a[i][k]][j])al[a[i][k]][j]=1,in[j]++;
        }
        minn=cmin(minn,a[i][1]);
        maxx=cmax(maxx,a[i][a[i][0]]);
    }
    printf("%d",tsort());
    return 0; 
}
//沒有什麼是兩個巴掌不能解決的,如果有就再來兩個巴掌

————————————華麗的分割線————————————
我中了忌開電腦的毒qwq 。。。。。
光速打臉啪啪啪