算法分析實驗題集

本文轉載自博客

http://blog.csdn.net/mzx0821


      雨紛紛、舊故里草木深、我聽聞、你始終一個人、斑駁的城門、盤踞着老樹根、石板上回蕩的是再等、


                                                                      —— 永不放棄的Mzx0821


希望所有的同學算法分析都都不會掛科、

注:題庫包括卓越班實驗題和非卓越班實驗題、因爲不知道老師會不會考超範圍的、

因爲OJ數據弱的原因、不保證以下解法的正確性、特別感謝small rabbit貢獻的部分答案、


非卓越班實驗題彙總

實驗一:

249  凸包面積

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
 
struct P{
    double x,y;
    P(){}
    P(double x1,double y1)
    {
        x=x1;
        y=y1;
    }
    double add(double a,double b)
    {
        return a+b;
    }
    P operator + (P p)
    {
        return P(add(x,p.x),add(y,p.y));
    }
    P operator - (P p)
    {
        return P(add(x,-p.x),add(y,-p.y));
    }
    double  det(P p)
    {
        return x*p.y-y*p.x;
    }
};
 
bool cmp(P a,P b)
{  
    if(a.x != b.x)
        return a.x<b.x;
    return a.y<b.y;
}
 
P p[1005],s[1005];
 
int main()
{
    int n;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int i;
        for(i=0;i<n;++i)
        {
            scanf("%lf%lf",&p[i].x,&p[i].y);
        }
        int k=0;
        sort(p,p+n,cmp);
        for (i=0;i<n;++i)
        {
            while(k>=2 && (s[k-1]-s[k-2]).det(p[i]-s[k-2]) <= 0)
                k--;
            s[k++]=p[i];
        }
        int t=k;
        for(i=n-1;i>=0;i--)
        {
            while(k>t && (s[k-1]-s[k-2]).det(p[i]-s[k-2]) <= 0)
                k--;
            s[k++]=p[i];
        }
        double ans=0;
        while(k>=2)
        {
            P p1=s[k-1];
            P p2=s[k];
            P p3=s[0];
            ans+=fabs(0.5*(p1.det(p2)+p2.det(p3)+p3.det(p1)));
            k--;
        }
        printf("%.1lf\n",ans);
    }
    return 0;
}
303  取模

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
#define LL long long
 
struct MOD
{
    LL init(char str[],LL z)
    {
        LL temp=0;
        for(int i=0;str[i];i++)
        {
            temp=temp*10+str[i]-'0';
            temp%=z;
        }
        return temp;
    }
    LL solve(LL x,LL y,LL z)
    {
        LL ans=1;
        while(y)
        {
            if(y&1)ans=ans*x%z;
            x=x*x%z;
            y>>=1;
        }
        return ans;
    }
};
int main()
{
    MOD mod;
    char str[105];
    LL x,y,z;
    while(scanf("%s%lld%lld",str,&y,&z)!=EOF)
    {
        x=mod.init(str,z);
        printf("%lld\n",mod.solve(x,y,z));
    }
}
352   合併果子

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
 
class MergeFruit
{
    private:
        priority_queue<int, vector<int>, greater<int> >q;
        int n;
        int x;
        int sum;
    public:
        void Init()
        {
            sum=0;
        }
        void Scan()
        {
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                 scanf("%d",&x);
                 q.push(x);
            }
        }
        void Run()
        {
            while(!q.empty())
            {
                int min_1=q.top();
                q.pop();
                if(q.empty())break;
                int min_2=q.top();
                q.pop();
                int ans=min_1+min_2;
                q.push(ans);
                sum+=ans;
            }
        }
        void Print()
        {
            cout<<sum<<endl;
        }
};
 
 
int main()
{
    MergeFruit mergefruit;
    mergefruit.Init();
    mergefruit.Scan();
    mergefruit.Run();
    mergefruit.Print();
    return 0;
}
493   PostOffice

#include <stdio.h>
#include <math.h>
#include<algorithm>
using namespace std;
int main()
{
    int n,i,mid,length=0;
    int pos_x[10005],pos_y[10005];
    scanf("%d",&n);
    for (i=0;i<n;i++)
        scanf("%d %d",&pos_x[i],&pos_y[i]);
    sort(pos_x,pos_x+n);
    sort(pos_y,pos_y+n);
    mid=n/2;
    for(i=0;i<n;i++)
        length+=abs(pos_x[i]-pos_x[mid])+abs(pos_y[i]-pos_y[mid]);
    printf("%d\n",length);
    return 0;
}

794   最近對問題

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define inf 0x7ffffff
   
struct node{
    double  x;
    double  y;
}a[100001];
int temp[100001];
bool cmp(node a,node b)
{
    if(a.x != b.x)
        return a.x<b.x;
    return a.y<b.y;
}
   
bool cmp1(int c,int b)
{
    return a[c].y<a[b].y;
}
   
   
double min(double a,double b)
{
    return a<b?a:b;
}
   
double dis(int i,int j)
{
    return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)
    +(a[i].y-a[j].y)*(a[i].y-a[j].y));
}
   
double Find(int l,int r)
{
    double d;
    if(l == r)
        return inf;
    if(l + 1 == r)
        return dis(l,r);
    int mid=(l+r)>>1;
    double d1=Find(l,mid);
    double d2=Find(mid+1,r);
    d=min(d1,d2);
    int cnt=0;
    int i,j;
       
    for(i=l;i<=r;++i)
    {
        if(fabs(a[i].x-a[mid].x) <= d)
            temp[cnt++]=i;
    }   
      
   sort(temp,temp+cnt,cmp1);
    for(i=0;i<cnt;++i)
    {
        for(j=i+1;j<cnt && (a[temp[j]].y-a[temp[i]].y < d);++j)
        {
            d=min(d,dis(temp[i],temp[j]));
        }
    }
    return d;
}
   
int main()
{
    int T;
    int n;
    scanf("%d",&T);
    while(T--)
    {
        int i,j;
        scanf("%d",&n) ;
        for(i=0;i<n;++i)scanf("%lf%lf",&a[i].x,&a[i].y);
        sort(a,a+n,cmp);
        printf("%.4lf\n",Find(0,n-1));  
    }
    return 0;
}
實驗二:
76   數字模式的識別

#include<stdio.h>
#define N 4000001
int a[N]={0};
int main()
{
    int n,i,b,x,y;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&b);
        a[b+2000000]++;
    }
    x=0;
    for(i=0;i<N;i++)
    {
        if(a[i]>x)
        {
            x=a[i];
            y=i;
        }
    }
    printf("%d\n",y-2000000);
    return 0;
}

254   翻煎餅

#include<iostream>
using namespace std;
int s[1000];
int  main()
{
    int i,n,k=0;
    cin>>n;
    for(i=0l;i<n;i++)
        cin>>s[i];
    for(;n>1;n--)
    {
        int max=0,l=0;
        for(i=0;i<n;i++)
        { 
            if(s[i]>max)
        {
            max=s[i];
            l=i;
        }
        }
        if(l==0)
        {
            k+=1;
            for(i=0;i<n/2;i++)
            {
                int 
                    t=s[i];
                s[i]=s[n-1-i];
                s[n-1-i]=t;
            }
               
        }
        else if(l<n-1)
        {
            k+=2;
            for(i=0;i<(l+1)/2;i++)
            {
                int t=s[i];
                s[i]=s[l-i];
                s[l-i]=t;
            }
            for(i=0;i<n/2;i++)
            {
                int t=s[i];
                s[i]=s[n-1-i];
                s[n-1-i]=t;
            }
        }
    }  
    cout<<k<<endl;
}

342   變位詞

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
    char s1[1000],s2[1000];
    int  n,len1,len2;
    cin>>n;
    while(n--)
    {  
        cin>>s1>>s2;
        len1=strlen(s1);
        len2=strlen(s2);
        sort(s1,s1+len1);
        sort(s2,s2+len2);
        if(strcmp(s1,s2)==0)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
          
    }
    return 0;
}
445   選擇問題

#include<iostream>
using namespace std;
int main()
{
    int n,i,j,a[10002],temp,m;
    cin >> n >> m;
    for(i=0;i<n;i++)
    {
        cin >> a[i];
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n-i-1;j++)
        {
            if(a[j]>a[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
    cout << a[m-1] << endl;
    return 0;
}
541   排列的字典序問題

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
   
#define ll long long
int a[55];
int t[55];
int main()
{
    int n;
    ll num[15];
    num[1]=1;
    int i;
    for(i=2;i<15;++i)
        num[i]=num[i-1]*i;
    while(scanf("%d",&n) != EOF)
    {
        ll ans=0;
        int ss=0;
        int f=-1;
        for(i=0;i<n;++i)scanf("%d",&a[i]);
        for(i=0;i<n;++i)
        {
            int count=0;
            int j;
            for(j=i+1;j<n;++j)
            {
                if(a[i]>a[j])
                    count++;
            }
            t[i]=count;
        }
        for(i=0;i<n;++i)
        {
            ans+=t[i]*num[n-1-i];
        }
        for(i=n-1;i>=0;--i)
        {
            if(a[i]<ss && f == -1)
            {
                f=i;
            }
            ss=a[i];
        }
        int tt=a[f];
        int vis;
        sort(a+f,a+n);
        for(i=f;i<n;++i)
        {
            if(a[i]>tt)
            {
                vis=i;
                break;
            }
        }
        printf("%lld\n",ans);
        for(i=0;i<n;++i)
        {
            if(i == vis)
            continue;
            if(i == f)
                printf("%d ",a[vis]);
            printf("%d ",a[i]);
        }
        printf("\n");
    }
    return 0;
}
642   俄式乘法

#include<cstdio>
#include<cstring>
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m) != EOF)
    {
        bool first=0;
        int ans=0;
        while(n)
        {
            if(n%2 == 0)
            {
                n/=2;
                m*=2;
            }
            else
            {
                if(first)
                printf(" + ");
                n=(n-1)/2;
                printf("%d",m);
                first=1;
                ans+=m;
                m=m*2;
            }
        }
        printf(" = %d\n",ans);
    }
    return 0;
}

實驗三:

傳送門:http://blog.csdn.net/mzx0821/article/details/41593241


卓越班實驗題目彙總

注:和上面重複的題我就不再寫了、
實驗一:
640   Binary search
#include<cstdio>
#include<cstring>

int a[5000001];
int main()
{
    int n,k;
    while(scanf("%d%d",&n,&k) != EOF)
    {
        int i;
        for(i=0;i<n;++i)
        {
            scanf("%d",&a[i]);
        }
        int ans=-1;
        int l=0,r=n-1;
        while(l <= r)
        {
            int mid=(l+r)/2;
            if(a[mid] == k)
            {
                ans=mid;
                break;
            }
            if(a[mid] > k)
                r=mid-1;
            else
                l=mid+1;
        }
        printf("%d\n",ans+1);
    }
    return 0;
}
956   約瑟夫問題的實現
#include<cstdio>
 
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m) != EOF)
    {
        int ans=0;
        for(int i=2;i<=n;++i)
            ans=(ans+m)%i;
        printf("%d",ans+1);
    }
    return 0;
}

實驗二:
005   Euclid's Game
#include<cstdio>
  
int a,b;
 
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
  
int main()
{
    while(scanf("%d%d",&a,&b) != EOF)
    {
        int t=gcd(a,b);
        a/=t;
        b/=t;
        if(a%2 == 1)printf("A\n");
        else printf("B\n");
    }
    return 0;
}

405   Fibonacci number
#include<stdio.h>
int a[41];
int main()
{
    int n,i;
    scanf("%d",&n);
    a[0]=0;
    a[1]=1;
    a[2]=1;
    for(i=3;i<=n;i++)
    {
        a[i]=a[i-1]+a[i-2];
    }
    printf("%d\n",a[n]);
    return 0;
}
413   Quick Sort
#include<cstdio>
#include<cstring>
 
int a[50005];
 
void quick_sort(int l,int r,int a[])
{
    if(l<r)
    {
        int i=l,j=r;
        int temp;
          temp=a[l];
        while(i<j)
        {
            while(i<j && a[j] >= temp)
                j--;
            if(i<j)
                a[i++]=a[j];
            while(i<j && a[i] <= temp)
                i++;
            if(i<j)
                a[j--]=a[i];
        }
        a[i]=temp;
        quick_sort(l,i-1,a);
        quick_sort(i+1,r,a);
    }
}
 
int main()
{
    int n;
    while(scanf("%d",&n) != EOF)
    {
        for(int i=0;i<n;++i)
        {
            scanf("%d",&a[i]);
        }
        quick_sort(0,n-1,a);
        for(int i=0;i<n;++i)
        {
            printf("%d ",a[i]);
        }
        printf("\n");
    }
    return 0;
}
414   The Next Permutation
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
 
char str[1005];
 
int main()
{
     int m,n,len;
     cin>>m;
     memset(str,0,sizeof(str));                           
     while(m--)
     {
          cin>>n>>str;
          len=strlen(str);
          if(next_permutation(str,str+len))
                 cout<<n<<" "<<str<<endl;
          else
                 cout<<n<<" "<<"BIGGEST"<<endl;
     }
     return 0;
}
425   Polynomial calculate
#include<cstdio>
#include<cstring>
 
int main()
{
    int n,x;
    while(scanf("%d%d",&n,&x) != EOF)
    {
        int a[22];
        for(int i=0;i<=n;++i)
        {
            scanf("%d",&a[i]);
        }
        if(n == 0)
        {
            printf("0\n");
            continue;
        }
        int sum=a[n];
        for(int i=n-1;i>=0;i--)
            sum=sum*x+a[i];
        printf("%d\n",sum);
    }
    return 0;
}
446    合併排序
#include<cstdio>
 
int a[10005];
int b[10005];
 
void merge(int a[],int l,int mid,int r)
{
    int cnt=0;
    int i=l;
    int j=mid+1;
    while(i<=mid && j <= r)
    {
        if(a[i] < a[j])
        {
            b[cnt++]=a[i++];
        }
        else
        b[cnt++]=a[j++];
    }
    while(i<=mid)
    b[cnt++]=a[i++];
    while(j<=r)
    b[cnt++]=a[j++];
    int t=0;
    for(int i=l;i<=r;++i)
    a[i]=b[t++];
     
}
 
void hebing(int l,int r,int a[])
{
    int mid=(l+r)/2;
    if(l<r)
    {
        hebing(l,mid,a);
        hebing(mid+1,r,a);
        merge(a,l,mid,r);
    }
}
 
int main()
{
    int n;
    while(scanf("%d",&n) != EOF)
    {
        for(int i=0;i<n;++i)
        scanf("%d",&a[i]);
        hebing(0,n-1,a);
         
        for(int i=0;i<n-1;++i)
        {
            if(i%10 == 0)
            printf("%d",a[i]);
            else if((i+1)%10 == 0)
            printf("  %d\n",a[i]);
            else
            printf("  %d",a[i]);
        }
        if((n-1)%10 == 0)
        printf("%d\n",a[n-1]);
        else
        printf("  %d\n",a[n-1]);
    }
    return 0;
} 
480   Locker doors
#include<cstdio>
#include<cstring>
#include<cmath>
 
int a[100005];
int main()
{
    for(int i=1;i <= 100000;++i)
    {
        int t=sqrt((double)i);
        if(t*t == i)
            a[i]=1;
        a[i]+=a[i-1];
    }
    int n;
    while(scanf("%d",&n) != EOF)
    {
        printf("%d\n",a[n]);
    }
    return 0;
}
641  The Dutch flag problem
#include<cstdio>
 
char str[500005];
 
int main()
{
    int numR,numB,numW;
    int n;
    while(scanf("%d",&n) != EOF)
    {
        numR=numB=numW=0;
        scanf("%s",str);
        for(int i=0;str[i];++i)
        {
            if(str[i] == 'W')
                numW++;
            else if(str[i] == 'B')
                numB++;
            else if(str[i] == 'R')
                numR++;
        }
        for(int i=0;i<numR;++i)
            printf("R");
        for(int i=0;i<numW;++i)
            printf("W");
        for(int i=0;i<numB;++i)
            printf("B");
        printf("\n");
    }
    return 0;
}
411  售貨員的難題
#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
int dp[21][1<<20];
int map[25][25];
int n;
int min(int a,int b)
{
    return a<b?a:b;
}
int solve()
{
    int i,j,k;
    int st=1<<(n+1);
    for(i=0;i<=n;++i)
        for(j=0;j<st;++j)
            dp[i][j]=inf;
 
    dp[0][1]=0;
    for(i=1;i<st;++i)
    {
        for(j=0;j<=n;++j)
        {
            if((i&(1<<j)) == 0)
                continue;
            for(k=0;k<=n;++k)
            {
                if((i&(1<<k)) == 0)
                    dp[k][i|(1<<k)]=min(dp[k][i|(1<<k)],dp[j][i]+map[j][k]);
            }
        }
    }
    return dp[n][st-1];
}
 
int main()
{
 
    while(scanf("%d",&n) != EOF)
    {
        int i,j;
        for(i=0;i<n;++i)
        {
            for(j=0;j<n;++j)
                scanf("%d",&map[i][j]);
            map[i][n]=map[i][0];
        }
        int ans=solve();
        printf("%d\n",ans);
    }
    return 0;
}
572   Boyer–Moore–Horspool algorithm
#include<cstdio>
#include<cstring>
 
char str1[200005];
char str2[800005];
int next[800005];
 
void getnext(int len)
{
    int j,k;
    j=0,k=-1;
    next[0]=-1;
    while(j<len-1)
    {
        if(k == -1 || str1[j] == str1[k])
        {
            j++;
            k++;
            next[j]=k;
        }
        else
        k=next[k];
    }
}
 
int kmpindex(int len1,int len2)
{
    int i=0,j=0;
    getnext(len2);
    while(j<len1 && i<len2)
    {
        if(j == -1 || str1[j] == str2[i])
        {
            i++;
            j++;
        }
        else
        j=next[j];
    }
    if(j>=len1)
    return i-len1;
    return -1;
}
 
int main()
{
    while(scanf("%s%s",str1,str2) != EOF)
    {
        int len1=strlen(str1);
        int len2=strlen(str2);
        int ans=kmpindex(len1,len2);
        printf("%d\n",ans);
    }
    return 0;
}
649   NBA Finals
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
   
float dp[505][505];
   
int main()
{
    int n;
    float p,q;
    while(cin>>n>>p)
    {
        q=1-p;
        memset(dp,0,sizeof(dp));
        float ans=0;
         
         for(int i=0;i<=n;i++)
            dp[0][i]=1;
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=n;++j)
            {
                dp[i][j]=dp[i-1][j]*p+dp[i][j-1]*q;
            }
        }
        cout<<dp[n/2+1][n/2+1]<<endl;
    }
    return 0;
}

680   Jack Straws
這標籤給的也是醉了、就是一個並查集、無語、、
#include <iostream>  
#include <memory>  
#define MAX_N 13  
#define MAXV(x, y) ((x) >= (y) ? (x) : (y))  
#define MINV(x, y) ((x) <= (y) ? (x) : (y))  
using namespace std;  
int num;  
struct node  
{  
    int x1, y1, x2, y2;  
}data[MAX_N + 1];  
int set[MAX_N + 1];  
int rank[MAX_N + 1];  
//判斷第3個點在1,2點構成的線短的哪個方向, -1: 逆時針方向, 1: 順時針方向  
int direct(int x1, int y1, int x2, int y2, int x3, int y3)  
{  
    return (x3 - x1) * (y2 - y1) - (x2 - x1) * (y3 - y1);      
}  
//判斷第3個點是否在1,2點構成的線短上  
bool onLine(int x1, int y1, int x2, int y2, int x3, int y3)  
{  
   return (MINV(x1, x2) <= x3 && x3 <= MAXV(x1, x2) && MINV(y1, y2) <= y3 && y3 <= MAXV(y1, y2));  
}  
//判斷點1,2構成的線短與點3,4構成的線短是否相交  
bool intersect(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)  
{  
    int d1 = direct(x3, y3, x4, y4, x1, y1);  
    int d2 = direct(x3, y3, x4, y4, x2, y2);  
    int d3 = direct(x1, y1, x2, y2, x3, y3);  
    int d4 = direct(x1, y1, x2, y2, x4, y4);  
    if(((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0)))  
        return true;  
    if(d1 == 0 && onLine(x3, y3, x4, y4, x1, y1))  
        return true;  
    else if(d2 == 0 && onLine(x3, y3, x4, y4, x2, y2))  
        return true;  
    else if(d3 == 0 && onLine(x1, y1, x2, y2, x3, y3))  
        return true;  
    else if(d4 == 0 && onLine(x1, y1, x2, y2, x4, y4))  
        return true;  
    else  
        return false;  
}  
int find(int pos)  
{  
    if(pos != set[pos])  
        set[pos] = find(set[pos]);  
    return set[pos];  
}  
void joinSet(int pos1, int pos2)  
{  
    if(pos1 == pos2)  
        return;  
    int pre1 = find(pos1);  
    int pre2 = find(pos2);  
    if(pre1 == pre2)  
        return;  
    else  
    {  
        int rank1 = rank[pre1];  
        int rank2 = rank[pre2];  
        if(rank1 < rank2)  
            set[pre1] = pre2;  
        else if(rank1 > rank2)  
            set[pre2] = pre1;  
        else   
        {  
            rank[pre1]++;  
            set[pre2] = pre1;  
        }  
    }  
}  
void init()  
{  
    int i;   
    for(i = 1; i <= num; i++)  
    {  
        set[i] = i;  
        rank[i] = 0;  
    }  
}  
int main()  
{  
    int i, n1, n2, pre1, pre2;  
    while(cin>>num && num != 0)  
    {  
        for(i = 1; i <= num; i++)  
            cin>>data[i].x1>>data[i].y1>>data[i].x2>>data[i].y2;  
        init();  
        for(n1 = 1; n1 <= num; n1++)  
        {  
            for(n2 = n1; n2 <= num; n2++)  
            {  
                pre1 = find(n1);  
                pre2 = find(n2);  
                if(pre1 == pre2)  
                    continue;  
                else  
                {  
                    if(intersect(data[n1].x1, data[n1].y1, data[n1].x2, data[n1].y2,   
                        data[n2].x1, data[n2].y1, data[n2].x2, data[n2].y2))  
                        joinSet(n1, n2);  
                }  
            }  
        }  
        while(cin>>n1>>n2 && !(n1 == 0 && n2 == 0))  
        {  
            pre1 = find(n1);  
            pre2 = find(n2);  
            if(pre1 == pre2)  
                cout<<"CONNECTED"<<endl;  
            else  
                cout<<"NOT CONNECTED"<<endl;  
        }  
    }  
    return 0;  
}
410   尼克的任務
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int p[10005][20], dp[10005];
    int Time, N;
    int s, len;
    while(cin>>Time>>N)
    {
        memset(p, 0, sizeof(p));
        memset(dp, 0, sizeof(dp));
        for (int i = 0; i < N; i++)
        {
            cin>>s>>len;
            p[s][0]++;
            p[s][p[s][0]] = len;
        }
        for (int i = Time; i >= 1; i--)
        {
            if (p[i][0] == 0)
            {
                dp[i] = dp[i + 1] + 1;
            }
            else
                if (p[i][0] == 1)
                {
                    dp[i] = max(dp[i + p[i][1]], dp[i]);
                }
                else
                {
                    for (int j = 1; j <= p[i][0]; j++)
                    {
                        dp[i] = max(dp[i], dp[i + p[i][j]]);
                    }
                }
        }
        cout<<dp[1]<<endl;
    }
    return 0;
}
544   跑跑卡丁車
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 0x73737373
int a[10010], b[10010], dp[10010][15];
void input(int L, int N, int a[])
{
    for(int i = 1; i <= L; i++)
    {
        scanf("%d", &a[i]);
        for(int j = 1; j < N; j++)
            a[i + j * L] = a[i];
    }
}
int main()
{
    int L, N;
    while(~scanf("%d%d", &L, &N))
    {
        input(L, N, a);
        input(L, N, b);
        for(int i = 0; i <= L * N; i++)
            for(int j = 0; j < 15; j++)
                dp[i][j] = INF;
        dp[0][0] = 0;
        for(int i = 1; i <= L * N; i++)
        {
            for(int j = 0; j < 15; j++)
            {
                if(j != 0)dp[i][j] = min(dp[i][j], dp[i-1][j-1] + a[i]);
                if(j == 10) dp[i][j] = min(dp[i][j], dp[i-1][14] + a[i]);
                if(j < 10)dp[i][j] = min(dp[i][j], dp[i-1][j+5] + b[i]);
            }
        }
        int ret = INF;
        for(int i = 0; i < 15; i++)
            ret = min(dp[L * N][i], ret);
        printf("%d\n", ret);
    }
    return 0;
}
679    Secret Code
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
const int maxn=110;
LL xr,xi,br,bi,num;
LL flag,t;
LL ans[maxn];//保存枚舉的ai
void dfs(LL rr,LL ii,LL step)
{
    LL x,y,i;
    if (step>100)return;
    if(flag)return;
    if(rr==0&&ii==0)
    {
        flag=1;
        t=step;
        return;
    }
    for(i=0;i*i<num;i++)
    {
    //複數除法運算
        x=(rr-i)*br+ii*bi;
        y=ii*br-(rr-i)*bi;
        ans[step]=i;
        if(x%num==0&&y%num==0)//保證整除
        dfs(x/num,y/num,step+1);
        if(flag)return;
    }
}
int main()
{
    LL T,i;
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld%lld%lld%lld",&xr,&xi,&br,&bi);
        num=br*br+bi*bi;
        flag=0;
        dfs(xr,xi,0);
        if(!flag)printf("The code cannot be decrypted.\n");
        else
        {
            printf("%lld",ans[t-1]);
            for(i=t-2;i>=0;i--)
            printf(",%lld",ans[i]);
            printf("\n");
        }
    }
    return 0;
}

698   Independent Task Scheduling
#include <stdio.h>
int main()
{
    float x1,x2,x3,y1,y2,y3;
    float s;
    while(scanf("%f%f%f%f%f%f",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF)
    {
        s=(x1*y2+x2*y3+x3*y1-x3*y2-x1*y3-x2*y1)/2.0;
        if(s<0)s=-s;
        printf("%.1f\n",s);
    }
    return 0;
}
1080    單純行法
明明叫做單純形法好麼。。。數學渣、不會做、等有空問下理學院的同學怎麼搞、



















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章