算法设计与分析 - AC 代码 - 第 3 弹

PTA-算法设计与分析
7-1 c++(g++)
#include<bits/stdc++.h>
using namespace std;
long max3(long a,long b,long c)
{   if(a<b) a=b;
    if(a>c) return a;
    else return c;
}
long maxSubSum(int a[],int left,int right)
{   int i,j;
    long maxLeftSum,maxRightSum;
    long maxLeftBorderSum,leftBorderSum;
    long maxRightBorderSum,rightBorderSum;
    if(left==right)
    {   if(a[left]>0)
            return a[left];
        else 
            return 0;
    }
    int mid=(left+right)/2;
    maxLeftSum=maxSubSum(a,left,mid);
    maxRightSum=maxSubSum(a,mid+1,right);
    maxLeftBorderSum=0,leftBorderSum=0;
    for(i=mid;i>=left;i--)
    {   leftBorderSum+=a[i];
        if(leftBorderSum>maxLeftBorderSum)
            maxLeftBorderSum=leftBorderSum;
    }
    maxRightBorderSum=0,rightBorderSum=0;
    for(j=mid+1;j<=right;j++)
    {   rightBorderSum+=a[j];
        if(rightBorderSum>maxRightBorderSum)
            maxRightBorderSum=rightBorderSum;
    }
    return max3(maxLeftSum,maxRightSum,maxLeftBorderSum+maxRightBorderSum);
}

int main()
{   int n;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++)
    {   cin>>a[i];
    }
    cout<<maxSubSum(a,0,n-1)<<endl;
}
7-2 c++(g++)
#include<bits/stdc++.h>
using namespace std;

int n;
int flag[10000000+1]; 
int count(int n) {
    int cnt = 0;
    flag[2] = 1;
    for (int i = 3; i <= n; ++i) {
        flag[i++] = 1;               // 奇数位
        flag[i] = 0;                 // 偶数位直接过滤
    }
    for (int i = 3; i <= sqrt(n*1); ++i) {
        if (flag[i] != 1) continue;
        for (int j = i*i; j <= n; j += i) {
                            // 将倍数转换为加法
            flag[j] = 0;
        }
    }
    for (int i = 1; i <= n; ++i)
        cnt += flag[i];
    return cnt;
}
int main()
{   cin>>n;
    cout<<count(n);
}
7-3 c++(g++)
#include <stdio.h>
#include <string.h>
int main()
{
    char a[6],b[81];
    int i,j,k,m,n,c[6]={0};
    while(gets(a)&&a[0]!='#')
    {
        gets(b);
        m=strlen(a);
        n=strlen(b);
        for(i=0;i<m;i++)
          {
            c[i]=0;
          for(j=0;j<n;j++)
          {
            if(a[i]==b[j])
               c[i]++;
          }
          }
          for(i=0;i<m;i++)
            printf("%c %d\n",a[i],c[i]);
    }
    return 0;
}

7-4 c++(g++)
#include<stdio.h>
long long d[102];
int main()
{
    int T,n,i;
    scanf("%d",&T);
    for(i=0;i<102;i++) d[i]=0;
    d[1]=0;
    d[2]=1;
    for(i=3;i<=100;i++)    
        d[i]=((i-1)*(d[i-1]%1000000007+d[i-2]%1000000007))%1000000007;
    /*
        right now: MOD=1000000007;

      for(i=3;i<=100;i++)
        {
        a[i]=a[i-1]+a[i-2];
        a[i]%=MOD;
        a[i]*=i-1;
        a[i]%=MOD;
        }
    */   
    while(T--)
    { 
       
       scanf("%d",&n);      
       printf("%lld\n",d[n]);                  
    }
    return 0;
}
7-5 c++(g++)
 
#include"iostream"
#include"cstdio"
#include"cstring"
using namespace std;
const int  maxn = 50;
 
int num[maxn + 1];
int c1[maxn + 1], c2[maxn + 1];
 
int main(){
    int T;
    scanf("%d",&T);
    while(T --){
        for(int i = 1;i <= 26;i ++)
            scanf("%d", &num[i]);
        memset(c1, 0, sizeof c1);
        memset(c2, 0, sizeof c2);
        for(int i = 0;i <= num[1];i ++)
            c1[i] = 1;
        for(int i = 2;i <= 26;i ++){        //共有26个多项式 
            if(num[i] == 0) continue;
            for(int j = 0;j <= maxn;j ++){  //共有maxn+1项 
                for(int k = 0;k <= num[i] && j + k*i <= maxn;k ++)
                    c2[j + k*i] += c1[j];
            }
            for(int j = 0;j <= maxn;j ++){
                c1[j] = c2[j];
                c2[j] = 0;
            }
        }       
        int sum = 0;
        for(int j = 1;j <= maxn;j ++) 
            sum += c1[j];   
        printf("%d\n",sum);
    }
    return 0;
}
7-6 c++(g++)
#include <iostream>
using namespace std;
const int MAXA=100;
int a[MAXA];

int max(int x, int y)
{   
    if (x < y)
    {
        cout << "max(" << x << "," << y << ")=" << y << " ";
        return y;
    }
    else
    {
        cout << "max(" << x << "," << y << ")=" << x << " ";
        return x;
    }
}

/**
 *  @brief Use digui to find the maxnumber of the array 
 *  arraymax(a,n)=max(a[0],a[1]);       n==2;
 *  arraymax(a,n)=max(arraymax(n-2),a[n-1]);    other situation; 
 *  
 *  @param a
 *  @param n sizeof(a)/sizeof(a[0])
 *  
 *  @return the number_value of array
 */
int arraymax(int a[], int n)
{   
    int b;
    if (n == 1)
        return max(a[0], a[1]);
    else if(n>1&&n<=30)
    {   b=arraymax(a,n-1);
        return max(b, a[n]);
    }
}

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    cout << arraymax(a, n-1) << endl;//0~n-1
    return 0;
}
7-7 c++(g++)
#include<iostream>
#include<algorithm>
using namespace std;
/**
 *  recursion && Division algorithm
*/

/**
 *  @brief recursion algroithm
 *  
 *  gcd(x,y)=y;   x%y=0;
 *  gcd(x,y)=disp;if(x%y>0)gcd(x%y,min(x,y)) else gcd(max(x,y),min(x,y));    other sitation;
 *  
 *  @param x
 *  @param y
 *  @return the number_value 
*/

int gcd(int x,int y)
{   
    // int a,a1,a2,a3,a4;
    if(x%y==0)
    {   cout<<"gcd("<<x<<","<<y<<") ";
        return y;
    }    
    else
    {
        cout<<"gcd("<<x<<","<<y<<") ";
        // a=x%y;
        // a1=max(x,y);
        // a2=min(x,y);
        // a3=min(a,y);
        // a4=min(x,a)
        if(x/y>0)
            return gcd(y,x%y);
        else
            return gcd(max(x,y),min(x,y));
    }
    

}

int main()
{
    int x,y;
    cin>>x;cin>>y;
    cout<<gcd(x,y);
}
7-8 c++(g++)
 #include <stdio.h>

void swap(int a[], int i, int j)
{
    // 交换数组a中元素i与元素j的值
    int tmp;
    tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}

int partition(int a[], int lo, int hi)
{
    int i = lo-1, pivot = a[lo];
    swap(a, lo, hi);
    while(lo<hi)
    {
        // 循环开始的时候i指向的是小于pivot的最后的一个位置
        if(a[lo] < pivot)
        {
            i ++;
            swap(a, i, lo);
        }
        lo ++;
    }
    i ++;
    swap(a, i, hi);
    return i;
}

int find(int a[], int left, int right, int k)
{
    int index;
    index = partition(a, left, right);
    if(index == k)
        return a[index];
    else if(index < k)
        return find(a, index+1, right, k);
    else
        return find(a, left, right-1, k);
}

int main()
{
    int a[10000];
    int n, k, i;
    scanf("%d", &n);
    scanf("%d", &k);
    for(i=0; i<n; i++)
        scanf("%d", &a[i]);
    printf("%d\n", find(a, 0, n-1, k-1));
}
7-9 c++(g++)
#include<bits/stdc++.h>
using namespace std;

void swap(int a,int b)
{   int tmp;
    if(a<b)
    {   tmp=a;
        a=b;
        b=tmp;
    }   
        
}
int num(int n,int a[])
{   int count=0;
    for(int j=0;j<n-1;j++)
        for(int i=0;i<=n-2;i++)
        {   if(a[i]>a[i+1])
            {   swap(a[i],a[i+1]);
                count++;
                break;
            }   
        }
    return count;
}
//               i==2
// 0 1 d 1 2 2083 s 2 3 2803 s 

int main()
{   int n;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++)
    {   cin>>a[i];
    }
    cout<<num(n,a);
}
7-10 c++(g++)
#include<stdio.h>
#include<string.h> 
int main()
{
    int n,i,j,max=0;//max为所用箱子的数目 
    int a[1005];//用来接收物品的
    int b[1005];//即用来描述物品,又用来记录装物品的箱子(看完代码后自然会理解) 
    int pox[10005];//箱子的位置 
    memset(pox,-1,sizeof(pox));
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        b[i]=a[i]; 
    }
    pox[0]=0;//将箱子的位置初始化为0,是为了与数组的下标匹配,更方便标记位置 
    for(i=1;i<n;i++)
    {
        for(j=0;j<i;j++)
        {
            if(a[i]+b[j]<=100)
            {
                b[j]=b[j]+a[i];//将两个物品放在一个箱子中 
                b[i]=0;//用于同步物品的信息 
                pox[i]=j;
                break; 
            }
            else
            {
                pox[i]=i;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        if(pox[i]>max)
        {
            max=pox[i];
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%d %d\n",a[i],pox[i]+1);
    }
    printf("%d",max+1);
    return 0;
} 
7-11 c++(g++)
 #include <iostream>    
using namespace std;
int a[1010];
int main()
{
    int n, k, i, h = 0, j = 0, b;
    cin >> n >> k;
    b = n;
    for (i = 0; i <= k; i++) //共有k+1个数,因为它们都是表示一个性质的,所以可以一起处理
        cin >> a[i];
    for (i = 0; i <= k; i++)
        if (a[i] > n)
        {
            cout << "No Solution!\n"; //只要有一段路程大于n就无法到达
            j = 1;                    //此处标记
            break;
        }
        // else
        {
            for (i = 1; i <= k; i++)
            {
                b -= a[i - 1];
                if (b < a[i])
                {
                    h++;
                    b = n;
                }
            }
        }
    if (!j) //利用标记法,要不然会错过h=0时的情况导致一个测试点无法通过(5分)
        cout << h << endl;
    return 0;
}
7-12 c++(g++)
#include<bits/stdc++.h>
using namespace std;
void greedy(int n,int start[],int end[]);
int a[1000],b[1000];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i];
}
sort(a,a+n);  //对开始时间进行上升排序
sort(b,b+n); //对结束时间进行上升排序
greedy(n,a,b);  //调用函数求最小会场数
}
void greedy(int n,int start[],int end[])
{
int j=0;
int count=0;
for(int i=0;i<n;i++)
{
if(start[i]<end[j]){
count++;//如果开始时间小于结束时间则另开辟一个会场
}else{
j++;//否则和下一个结束时间进行比较
}
}
printf("%d",count);
}
7-13 c++(g++)
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
int k;
    cin>>k;
     int a[k],b[k];
     for(int i=0;i<k;i++)
    {
         cin>>a[i];
     }
     sort(a,a+k);
     for(int i=k-1,j=0;i>=0;i--,j++)
     {
         b[j]=a[i];
     }
     int sum1=0,sum2=0;
     for(int i=0;i<k-1;i++)
     {
         a[i+1]=a[i]+a[i+1];
         sum1+=a[i+1];
         sort(a+i,a+k);
     }
     for(int j=0;j<k-1;j++)
     {
         b[j+1]=b[j]+b[j+1];
         sum2+=b[j+1];
     } 
     cout<<sum2-k+1<<" ";
     cout<<sum1-k+1<<endl;
    return 0;
 }
7-14 c++(g++)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
typedef struct ab{
    int s;
    int f;
};
int cmp(ab a,ab b)
{
    return a.f<b.f;
}
int main()
{
    int n;
    ab x[110];
    while(~scanf("%d",&n))
    {
        if(n==0)
        {
            break;
        }
        for(int i=0;i<n;i++)
        {
            scanf("%d %d",&x[i].s,&x[i].f);
        }
        sort(x,x+n,cmp);
        int sum=1;
        int fina=x[0].f;
        for(int i=1;i<n;i++)
        {
            if(x[i].s>=fina)
            {
                sum++;
                fina=x[i].f;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}
7-15 c++(g++)
#include<iostream>
    
using namespace std;
    
    int a[12][12] = {0,1,0,0,0,1,1,1,0,1,0,1,
    
                    0,0,0,1,0,0,0,0,1,0,0,1,
                    
                    0,1,0,1,0,1,1,1,0,1,0,0,
                    
                    0,1,0,0,0,0,0,1,0,0,1,1,
                    
                    0,0,0,0,1,0,0,0,0,0,0,0,
                    
                    0,0,1,0,0,0,1,0,0,0,1,0,
                    
                    0,0,1,0,0,0,0,0,1,0,0,0,
                    
                    1,0,0,1,0,1,0,0,0,1,0,1,
                    
                    0,0,1,0,1,0,1,0,1,0,0,0,
                    
                    0,0,0,0,0,1,0,0,0,1,1,0,
                    
                    0,0,0,0,0,1,0,0,0,0,0,0,
                    
                    0,1,0,1,0,0,0,1,0,1,0,0};
    int x1, x2, y1, y2, min1 = 210000000, t = 0, b[12][12] = {0}, c[12][12] = {0};
    
    
    int ff(int x, int y, int k)//当前的位置,k是当前的步数; 
    {
        int a1, a2, a3, a4;
        if(x < 0 || y < 0 ||x >= 12 || y >= 12)
        {
            return 0;
        }
        else
        {
            
            if(x == x2 && y == y2)
            {
                t++;
                if(min1 > k)    min1 = k;
                return 1;
            }
            else
            {
                if(k >= min1)   return 1;
                if(a[x][y] == 0)
                {
                    if(b[x][y] == 0)
                    {
                        if(c[x][y] == 0)
                        {
                            b[x][y] = 1;
                            a1 = ff(x+1, y, k+1);
                            a2 = ff(x, y+1, k+1);
                            a3 = ff(x-1, y, k+1);
                            a4 = ff(x, y-1, k+1);
                            b[x][y] = 0;
                            if(a1 == 0&&a2 == 0&&a3 == 0&&a4 == 0)
                            {
                                c[x][y] = 1;
                                return 0;
                            }
                            else    return 1;
                        }
                        return 0;    
                    }
                    else    return 1;   
                }
                else
                {
                    return 0;
                }
            }
        }
    }
    
    int main()
    {
        int i, j;
        cin>>x1>>y1>>x2>>y2;
        if(a[x2][y2] == 1)    cout<<"10000";
        else
        {
            ff(x1, y1, 1);
            if(t == 0)  cout<<"10000";
            else    cout<<min1-1;
        }
            
        
        return 0;
     } 
7-16 c++(g++)
#include<iostream>
    
    using namespace std;
    
    int a[10000], n, t, b[10000] = {0}, z = 0;
    int c[10000];
    void print(int k)
    {
        int i;
        z++;
        for(i = 1; i <= k; i++)
        {
            cout<<c[i]<<" ";
        }
        cout<<endl;
    }
    
    int ff()
    {
        int i = 1, sum = 0, j = 1;
        while(i > 0)
        {
            if(b[i] == 0)
            {
                b[i] = 1;
                sum += a[i];
                c[j] = a[i];
                j++;
                i++;
                if(sum == t)    return j;
                if(sum > t)
                {
                    sum -= a[i-1];
                    b[i-1] = 0;
                    j--;
                }
                if(i > n)
                {
                    i = n - 1;
                    if(b[n] == 1)
                    {
                        sum -= a[n];
                        b[n] = 0;
                        j--;
                        
                    }    
                    
                    while(b[i] == 0)
                    {
                        i--;
                        if(i < 0)    return 0;
                    }
                    j--;
                    sum -= a[i];
                    b[i] = 0;
                    i++;
                }
            }
        }
        return 0;   
    } 
    
    int main()
    {
        int i, j, tol = 0;
        cin>>n>>t;
        for(i = 1; i <= n; i++)
        {
            cin>>a[i];
            tol += a[i];
        }
        if(tol >= t)
        {
            j = ff();
            if(j) 
            {
                print(j-1);
            }   
            else    cout<<"No Solution!";
        }
        else        cout<<"No Solution!";   
        return 0;
    }
7.17 c++(g++)
#include<iostream>
#include<cstdlib>
    using namespace std;
    
    
    int n, a[1000], x, b[100] = {0}, Min = 2100000000;
    int compare(void const * q, void const * p)
    {
        return *(int *)q - *(int *)p;
    }
    
    int ff(int k)
    {
        int i, Max = 0, t;
        if(k <= n)
        {
            for(i = 1; i <= x; i++)
            {
                if((b[i] + a[k]) > Min)
                    return 0;
                b[i] += a[k];
                
                t = ff(k+1);
                //if(t == 0)    return 0;
                b[i] -= a[k];
            }
        }
        if(k > n)
        {
            for(i = 1; i <= x; i++)
            {
                if(b[i] > Max)    Max = b[i];
            }
            if(Min > Max)   Min = Max;
        }
    }
    
    int main()
    {
        int i;
        cin>>n>>x;
        for(i = 1; i <= n; i++)
        {
            cin>>a[i];
        }
        qsort(&a[1], n, sizeof(int), compare);
        ff(1);
        cout<<Min;
        return 0;   
    } 
7.18 c++(g++)
#include<iostream>
    
    using namespace std;
    
    int a[10005], n, t, b[10005] = {0}, z = 0;
    
    void print(int k)
    {
        int i;
        z++;
        for(i = 1; i < k; i++)
        {
            if(i == 1)  cout<<b[i];
            else    cout<<" "<<b[i];
        }
        cout<<endl;
    }
    
    void ff(int k, int w, int num)//k是前一个数的下表,w是当前要存入的下标 ,num是当前总数 
    {
        int i;
        if(num <= t)
        {
            if(num == t)
            {
                print(w);
            }
            else
            {
                for(i = k+1; i <= n; i++)
                {
                    b[w] = a[i];
                    ff(i, w+1, num+a[i]);
                }
            }
        }
    }
    
    
    int main()
    {
        int i;
        cin>>n;
        for(i = 1; i <= n; i++)
            cin>>a[i];
        cin>>t;
        ff(0, 1, 0);
        if(z == 0)  cout<<"None";
        return 0;
    }
7.19 c++(g++)
#include <stdio.h>
#define inf 0x3f3f3f3f

int n,ans;
int c[25][25];
int vis[25];

void dfs(int i,int sum)//i是行号 
{
    if(sum>ans) //剪枝 
        return ;
    if(i==n+1 && sum<ans)
    {
        ans=sum;
        return ;
    }
    for(int j=1;j<=n;j++) 
    {
        if(!vis[j])//遍历第i行 没有被遍历过列号j 的元素 
        {
            vis[j]=1;
            dfs(i+1,sum+c[i][j]);
            vis[j]=0;
        }
    }
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&c[i][j]);
    ans=inf;
    dfs(1,0);
    printf("%d\n",ans);
    return 0;
}
7-20 c++(g++)
#include<stdio.h>
#define MAX 100
#define max(x,y) ((x)>(y)?(x):(y))

int dp[MAX];
int ans = 0;

void solve(int a[],int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        dp[i]=1;
        for(j=0;j<i;j++)
        {
            if(a[i]>a[j])
                dp[i]=max(dp[i],dp[j]+1);
        }
    }
    ans=dp[0];
    for(i=1;i<n;i++)
        ans=max(ans,dp[i]);
}

int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    solve(a,n);
    printf("%d",ans);
    return 0;
} 
7-21 c++(g++)
#include<stdio.h>
#include"cstdio"
#include"iostream"
#include"string.h"
#include"algorithm"
using namespace std;
char str[1001];
int dp[1001][1001];
int main()
{

    memset(dp,0,sizeof(dp));
    char str1[1001];
    scanf("%s",str);
    int len=strlen(str);
    int j=len-1;
    for(int i=0;i<len;i++)
        str1[j--]=str[i];
    for(int i=1;i<=len;i++)
    {
        for(int j=1;j<=len;j++)
            if(str[i-1]==str1[j-1])
               dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
            else
                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
    }
    printf("%d\n",len-dp[len][len]);
}
7-22 c++(g++)
#include<bits/stdc++.h>
using namespace std;
long max3(long a,long b,long c)
{   if(a<b) a=b;
    if(a>c) return a;
    else return c;
}
long maxSubSum(int a[],int left,int right)
{   int i,j;
    long maxLeftSum,maxRightSum;
    long maxLeftBorderSum,leftBorderSum;
    long maxRightBorderSum,rightBorderSum;
    if(left==right)
    {   if(a[left]>0)
            return a[left];
        else 
            return 0;
    }
    int mid=(left+right)/2;
    maxLeftSum=maxSubSum(a,left,mid);
    maxRightSum=maxSubSum(a,mid+1,right);
    maxLeftBorderSum=0,leftBorderSum=0;
    for(i=mid;i>=left;i--)
    {   leftBorderSum+=a[i];
        if(leftBorderSum>maxLeftBorderSum)
            maxLeftBorderSum=leftBorderSum;
    }
    maxRightBorderSum=0,rightBorderSum=0;
    for(j=mid+1;j<=right;j++)
    {   rightBorderSum+=a[j];
        if(rightBorderSum>maxRightBorderSum)
            maxRightBorderSum=rightBorderSum;
    }
    return max3(maxLeftSum,maxRightSum,maxLeftBorderSum+maxRightBorderSum);
}

int main()
{   int n;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++)
    {   cin>>a[i];
    }
    cout<<maxSubSum(a,0,n-1)<<endl;
}
7-23 c++(g++)
#include<bits/stdc++.h>
using namespace std;
int main() {
    int n, k;
    while (~scanf("%d,%d", &n, &k)) {
        int dp[200][200];
        int i, j;
        for (i = 1; i <= n; i++) {
            for (j = 1; j <= k; j++) {
                if (j == 1 || i == 1)
                    dp[i][j] = 1;
                else if (j == i) {
                    dp[i][j] = dp[i][j - 1] + 1;
                }
                else if (i < j) {
                    dp[i][j] = dp[i][i];
                }
                else if (i > j) {
                    dp[i][j] = dp[i][j - 1] + dp[i - j][j];
                }
            }
        }
        printf("%d\n", dp[n][k]);
    }
    return 0;
}
7-24 c++(g++)
#include<iostream>
using namespace std;

int f(int n)

{

    int num1 = 1, num2 = 1, num3 = 0, i = 0;

    if (n <= 1)

    {

        return num1;

    }

    for (i = 1; i < n; i++)

    {

        num3 = num1 + num2;

        num1 = num2;

        num2 = num3;

    }

    return num3;

}


int main()
{

    int n,i;
    cin>>n;
    int a[n];
    for(i=0;i<n;i++)
        cin>>a[i];
    for(i=0;i<n;i++)
        cout<<f(a[i])<<endl;
    return 0;

}
7-25 c++(g++)
#include<stdio.h>
int father[30001],num[30001],tmp,vis[30001],cnt[30001];
int Find(int x)
{
    if(x != father[x])
      father[x] = Find(father[x]);
    
    return father[x];
}
int main(void)
{
    int N,M,flag,fcur,ans=0;
    scanf("%d%d",&N,&M);
    for(int i=0;i<=N;i++)
     father[i] = i;
    
    for(int i = 1;i<=M;i++)
    {
        int cnt,lf;
        scanf("%d",&cnt);
        flag = 1;
        for(int j=1;j<=cnt;j++){
            int cur;
            scanf("%d",&cur);
            if(num[cur]==0){ 
                if(j==1){
                   num[cur] = cur;
                   lf = father[cur];
                } 
                num[cur]    = cur;
                father[cur] = lf;
             
             } 
            else  {
                     if(j==1) 
                       lf = Find(cur);
                     int fcur = Find(cur);
                       father[fcur] = lf;
                  }
        }
         
    }
     
    for(int i=1;i<=N;i++){ 
     
        int fx = Find(i);
        cnt[fx]++;
       
        if(ans < cnt[fx])
        ans = cnt[fx];
        
    }
    
    printf("%d\n",ans);
    
    return 0;
}
7-26 c++(g++)
#include<iostream>
#include<cstring>
using namespace std;
typedef struct Node{
    char sex;
    int fId;
    int mId;
}Node; 
Node p[100001];
int flag,visited[100001];
void f(int a,int sum){
    if(sum > 5 || a == -1 || a == 0)//如果代数大于5代,或者a==-1,说明都不在人世,
                                    //或者a==0说明没有被赋值,直接返回 
        return;
    visited[a]++;//记录被访问的次数 
    if(visited[a] >= 2)//如果五代以内的同一个人被访问超过2次,说明在五代之内有共同的祖先 
        flag = 0;
    f(p[a].fId,sum + 1);//递归调用,a的父亲,代数+1 
    f(p[a].mId,sum + 1);//递归调用,a的母亲,代数+1 
    return;
}
int main(){
    int n,selfId,fId,mId,k,a,b;
    char c;
    scanf("%d",&n);
    for(int i = 0;i < n;i++){
            scanf("%d %c%d%d",&selfId,&c,&fId,&mId);
            p[selfId].sex = c;//记录自己的性别 
            p[selfId].fId = fId;//记录父亲的Id 
            p[selfId].mId = mId;
            p[fId].sex = 'M';//记录自己父亲的性别,否则,可能会漏掉 
            p[mId].sex = 'F';//记录自己母亲的性别,否则,可能会漏掉
    }
    scanf("%d",&k);
    while(k--){
        flag = 1;//标记变量,默认为1 
        memset(visited,0,sizeof(visited));//每循环一次,必须进行一次初始化 
        scanf("%d%d",&a,&b);
        if(p[a].sex == p[b].sex){           
            printf("Never Mind\n"); 
            continue;
        }   
        f(a,1);//以a为起点,代数为一代,进行寻找
        f(b,1);//以a为起点,代数为一代,进行寻找
        if(flag)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}
7-27 c++(g++) ×

7-28 c++(g++)
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
int  d[MAXN];
vector<int>edge[MAXN];
void dfs(int x,int o)
{
    d[x]=o;
    for(int i=0;i<edge[x].size();i++)
        dfs(edge[x][i],o+1);
}
int main()
{
    int n,k,x,s;
    cin>>n;
    s=(n+1)*n/2;
    for(int i=1;i<=n;i++)
    {
        cin>>k;
        while(k--)
        {
            cin>>x;
            s-=x;
            edge[i].push_back(x);
        }
    }
    dfs(s,1);
    s=0;
    for(int i=1;i<=n;i++)
        if(d[s]<d[i])
            s=i;
    cout<<s<<endl;
    return 0;
}
7-29 c++(g++)
#include <bits/stdc++.h>
 
using namespace std;
const int maxn=500+10;
const int INF=0x3f3f3f3f;
int V,E,s,t,num=0;
int cost[maxn][maxn];
int d[maxn];
int prev1[maxn];
int value[maxn];
int roadnum[maxn];
int amount[maxn];
bool used[maxn];
 
 
 
void dijkstra(int s)
{
    memset(d,INF,sizeof(d));
    memset(used,false,sizeof(used));
    memset(prev1,-1,sizeof(prev1));
    memset(roadnum,0,sizeof(roadnum));
    memset(amount,0,sizeof(amount));
    d[s]=0;
    roadnum[s]=1;
    amount[s]=value[s];
 
    while(true)
    {
        int v=-1;
        for(int u=0;u<V;u++)
        {
            if(!used[u]&&(v==-1||d[u]<d[v])) v=u;
        }
 
        if(v==-1) break;
        used[v]=true;
 
        for(int u=0;u<V;u++)
        {
 
            if(d[u]>d[v]+cost[v][u])
            {
                d[u]=d[v]+cost[v][u];
                amount[u]=amount[v]+value[u];
                roadnum[u]=roadnum[v];
                prev1[u]=v;
                //cout<<"gg1:     "<<amount[u]<<"    "<<u<<"    "<<v<<endl;
            }
            else if(d[u]==d[v]+cost[v][u])
            {
                roadnum[u]+=roadnum[v];
                if(amount[u]<amount[v]+value[u])
                {
                    amount[u]=amount[v]+value[u];
                    prev1[u]=v;
                    //cout<<"gg2:     "<<amount[u]<<"    "<<u<<"    "<<v<<endl;
 
                }
 
            }
 
        }
    }
}
 
 
int main()
{
    scanf("%d %d %d %d",&V,&E,&s,&t);
    for(int i=0;i<V;i++) memset(cost[i],INF,sizeof(cost[i]));
 
    for(int i=0;i<V;i++) scanf("%d",&value[i]);
    for(int i=0;i<E;i++)
    {
        int a,b,c; scanf("%d %d %d",&a,&b,&c);
        cost[a][b]=cost[b][a]=c;
    }
    dijkstra(s);
 
    int prevt[maxn];
    int pos=0;
 
    int tt=t;
    for(;tt!=-1;tt=prev1[tt])
    {
        prevt[pos++]=tt;
    }
 
    printf("%d %d\n",roadnum[t],amount[t]);
    for(int i=pos-1;i>=0;i--)
    {
        if(i) printf("%d ",prevt[i]);
        else printf("%d",prevt[i]);
    }
 
    return 0;
}
7-30 c++(g++)
#include<iostream> 
#include<cstring>
 
 
using namespace std;
int f[550],book[550];
 
struct edge{
    int x,y;
};
edge edges[6000];
int n,m,sum;
int find(int x)
{
    return f[x]<0?x:f[x]=find(f[x]);
}
void merge(int x,int y)
{
    int rx=find(x);
    int ry=find(y);
    if(rx!=ry)
    {
        f[rx]+=f[ry];
        f[ry]=rx;
    }
}
int main()
{
    cin>>n>>m;
    memset(f,-1,sizeof(f));
    for(int i=1;i<=m;i++)
    {
        int x,y;cin>>x>>y;
        edges[i]=edge{x,y};
        merge(x,y);
    }
    for(int i=0;i<n;i++)
    {
        if(f[i]<0)sum++;
    }
    
 
    int k;cin>>k;
    
    
    for(int i=1;i<=k;i++)
    {
        int cnt=0;
        memset(f,-1,sizeof(f));
        int x;cin>>x;book[x]=1;
        for(int j=1;j<=m;j++)
        {
            if(!book[edges[j].x]&&!book[edges[j].y])
            {
                merge(edges[j].x,edges[j].y);
            }
        }
        for(int i=0;i<n;i++)
        {
            if(!book[i]&&f[i]<0)cnt++;
        }
        //sum=cnt;
 
        if(cnt>sum) cout<<"Red Alert: City "<<x<<" is lost!"<<endl;
        else cout<<"City "<<x<<" is lost."<<endl;
        sum=cnt;
        if(i==n)cout<<"Game Over."<<endl;
    }
    return 0;
}
7-31 c++(g++)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e3+10;
struct node
{
    int x,y;
}a[maxn];
 
int n,d;
int di[maxn][maxn],via[maxn][maxn];
vector<int> apos;
stack<int> first;
 
void DFS(int i,int j)
{
    if(via[i][j]==-1)
    {
        if(i!=0)
          first.push(i);
    }
    else if(via[i][j]!=INF)
    {
        DFS(via[i][j],j);
        DFS(i,via[i][j]);
    }
 
    return ;
}
 
 
int main()
{
    scanf("%d %d",&n,&d);
 
    if(d>=50)
    {
        printf("1");
        return 0;
    }
 
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d",&a[i].x,&a[i].y);
 
        if(abs(a[i].x)+d>=50||abs(a[i].y)+d>=50)
        {
            apos.push_back(i);
        }
    }
    a[0].x=a[0].y=0;
 
    memset(di,INF,sizeof(di));
    memset(via,INF,sizeof(via));
 
    for(int i=0;i<=n;i++)
    {
        di[i][i]=0;
        for(int j=i+1;j<=n;j++)
        {
            double x=0;
            if(i==0) x=7.5;
 
            double tx=a[i].x-a[j].x;
            double ty=a[i].y-a[j].y;
            double td=d+x;
 
            if(tx*tx+ty*ty<=td*td)
            {
                di[i][j]=di[j][i]=1;
                via[i][j]=via[j][i]=-1;
            }
        }
    }
 
    for(int k=0;k<=n;k++)
    {
        for(int i=0;i<=n;i++)
        {
            if(di[i][k]==INF) continue;
            for(int j=0;j<=n;j++)
            {
                if(di[k][j]==INF) continue;
                if(di[i][j]>di[i][k]+di[k][j])
                {
                    di[i][j]=di[j][i]=di[i][k]+di[k][j];
                    via[i][j]=via[j][i]=k;
                }
            }
        }
    }
 
 
    int ans=INF;
    for(int i=0;i<apos.size();i++)
        ans=min(ans,di[0][apos[i]]);
 
    if(ans==INF)
    {
        printf("0");
        return 0;
    }
 
    int pos=-1,dmin=INF;
    for(int i=0;i<apos.size();i++)
    {
        if(ans==di[0][apos[i]])
        {
            DFS(0,apos[i]);
            int t=first.top();
            double tx=a[t].x;
            double ty=a[t].y;
 
            if(dmin>tx*tx+ty*ty)
            {
                pos=apos[i];
                dmin=tx*tx+ty*ty;
            }
 
            while(!first.empty()) first.pop();
        }
    }
 
    first.push(pos);
    DFS(0,pos);
    printf("%d\n",ans+1);
 
    while(!first.empty())
    {
        int t=first.top(); first.pop();
        printf("%d %d\n",a[t].x,a[t].y);
    }
 
 
    return 0;
}
7-32 c++(g++)
#include<iostream>
#include<vector>
#include<map>
using namespace std;

const int INF = 0x3f3f3f3f;
const int maxn = 200 + 10;
map<string,int> mp;                 
 
int n, k, w;                        
struct edge{
    int to,cost;
};
vector <edge> G[maxn];
int num[maxn];
 
int dis[maxn];
int cnt[maxn];
int sumnum[maxn];
int pred[maxn];
int cntshort[maxn];
int book[maxn];
vector <int> ljd;
int s, des;

void dijsk()
{
    
    for(int i = 0;i < n;i++)
        dis[i] = INF;
    
    dis[s] = 0;
    cntshort[s] = 1;                    
    book[s] = 1;
 
    for(int i = 0;i < G[s].size();i++)
    {
        int next = G[s][i].to;              
        dis[next] = G[s][i].cost;       
    
        cntshort[next] = 1;                 
        sumnum[next] = num[next];       
        pred[next] = s;                     
    }

    int min, minindex;
    for(int i = 1;i <= n - 1;i++)       
    {
        min = INF;
        minindex = 0;
        for(int i = 0;i < n;i++)        
        {
            if(dis[i] < min && book[i] != 1)        
            {
                min = dis[i];
                minindex = i;
            }
        } 
        book[minindex] = 1;
    
        for(int i = 0;i < G[minindex].size();i++)
        {
            edge& e = G[minindex][i];       
            int d2 = dis[minindex] + e.cost;    
        
            if(dis[e.to] > d2)
            {
                dis[e.to] = d2;             
                pred[e.to] = minindex;      
                cnt[e.to] = cnt[minindex] + 1;
                sumnum[e.to] = sumnum[minindex] + num[e.to];        
                cntshort[e.to] = cntshort[minindex]; 
            }
            else if(dis[e.to] == d2)
            {
                cntshort[e.to] += cntshort[minindex];       
                if(cnt[e.to] < cnt[minindex] + 1)       
                {
                
                    pred[e.to] = minindex;
                    cnt[e.to] = cnt[minindex] + 1;
                    sumnum[e.to] = sumnum[minindex] + num[e.to];
                } 
                else if(cnt[e.to] == cnt[minindex] + 1) 
                {
                    
                    if(sumnum[e.to] < sumnum[minindex] + num[e.to])
                    {
                        sumnum[e.to] = sumnum[minindex] + num[e.to];
                        pred[e.to] = minindex;
                    } 
                } 
            }
        }
    
    }
}

void dfs(int *p, int x,vector <int>& a)
{
    
    if(x == s)
    {
        a.push_back(x);
        return ;
    }
    dfs(p, p[x], a);            
    a.push_back(x);         
}

int main()
{
    string city[maxn];
    string city1, city2;
    cin >> n >> k >> city1 >> city2;        
    
    city[0] = city1;                    
    mp[city1] = 0;                      
    

    for(int i = 1;i < n;i++)
    {
        cin >> city[i] >> w;
        mp[city[i]] = i;                    
        num[i] = w;                     
    }

    s = 0;
    des = mp[city2];                
    
    int u, v;

    for(int i = 0;i < k;i++)
    {
        cin >> city1 >> city2 >> w;
        u = mp[city1];  v = mp[city2];  

        G[u].push_back((edge){v, w});   
        G[v].push_back((edge){u, w});
    } 

    dijsk(); 
    dfs(pred, des, ljd);
    cout<<city[0];      
    for(int i = 1;i<ljd.size();++i){    
        cout<<"->"<<city[ljd[i]];
    }
    printf("\n%d %d %d",cntshort[des],dis[des],sumnum[des]);
    return 0;
}
7-33 c++(g++)
#include <stdio.h>
#define MAXN 100

typedef struct 
{
    int arcs[MAXN][MAXN];
    int vexnum,arcnum; 
}AMGraph;

int main()
{
    int n;
    AMGraph G;
    
    scanf("%d %d %d",&G.vexnum, &n, &G.arcnum );
    int safecity[MAXN];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&safecity[i]);
    }
    for(int i=0;i<G.vexnum;i++)
    {
        for(int j=0;j<G.vexnum;j++)
        {
            G.arcs[i][j]=0;
        }
    }
    for(int i=0;i<G.arcnum;i++)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        G.arcs[x][y]=1;
        G.arcs[y][x]=1;
    }
    int now,destination,flag=0;
    scanf("%d %d",&now,&destination);
    for(int i=0;i<n;i++)
    {
        if(destination==safecity[i])
        {
            flag=1;
            break;
        }
    }
    if(G.arcs[now][destination]==1)
    {
        if(flag)
        printf("The city %d can arrive safely!\n",destination);
        else 
        {
            printf("The city %d is not safe!\n",destination);
            
        }
    }
    else
    {
        if(flag)
        printf("The city %d can not arrive safely!\n",destination);
        else printf("The city %d is not safe!\n",destination);
    }
    return 0;
}
7-34 c++(g++)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<math.h>
using namespace std;
const int maxm = 105;
const int maxn = 5005;
const int INF = 1000009;
int flag[maxm][maxm], key[maxm*maxm], dis[maxn][maxm];
int id[maxm][maxm], vis[maxm*maxm], head[maxm*maxm], map[maxm][maxm];
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
struct node
{
    int v, w, next;
}edge[maxm*maxm * 2];
struct point
{
    int x, v;
    point(int a, int b) :x(a), v(b) {}
    point() {}
};
int n, m, s, t, cnt;
void init()
{
    cnt = 0, s = 1, t = n*m;
    memset(head, -1, sizeof(head));
    memset(map, -1, sizeof(map));
    memset(key, 0, sizeof(key));
}
void add(int u, int v, int w)
{
    edge[cnt].v = v, edge[cnt].w = w;
    edge[cnt].next = head[u], head[u] = cnt++;
}
int bfs()
{
    queue<point>q;
    memset(dis, 0x3f, sizeof(dis));
    dis[1][s] = 0;
    q.push(point(1, s));
    while (!q.empty())
    {
        point now = q.front();q.pop();
        int u = now.v;
        dis[now.x | key[u]][u] = min(dis[now.x | key[u]][u], dis[now.x][u]);
        now.x |= key[u];
        for (int i = head[u];i != -1;i = edge[i].next)
        {
            int v = edge[i].v;
            if ((now.x&edge[i].w) == edge[i].w)
            {
                if (dis[now.x][v] > dis[now.x][u] + 1)
                {
                    dis[now.x][v] = dis[now.x][u] + 1;
                    q.push(point(now.x, v));
                }
            }
        }
    }
    int ans = INF;
    for (int i = 1;i < maxn;i++)
        ans = min(ans, dis[i][t]);
    if (ans == INF) return -1;
    return ans;
}
int main()
{
    int  i, j, k, sum, p, len = 0;
    int x1, x2, y1, y2, z, u, v;
    scanf("%d%d%d%d", &n, &m, &p, &k);
    init();
    for (i = 1;i <= n;i++)
        for (j = 1;j <= m;j++)
            id[i][j] = ++len;
    for (i = 1;i <= k;i++)
    {
        scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &z);
        u = id[x1][y1], v = id[x2][y2];
        map[u][v] = map[v][u] = z;
        if (z) add(u, v, 1 << z), add(v, u, 1 << z);
    }
    scanf("%d", &k);
    for (i = 1;i <= k;i++)
    {
        scanf("%d%d%d", &x1, &y1, &z);
        key[id[x1][y1]] |= 1 << z;
    }
    for (i = 1;i <= n;i++)
    {
        for (j = 1;j <= m;j++)
        {
            u = id[i][j];
            for (k = 0;k < 4;k++)
            {
                int x = i + dx[k];
                int y = j + dy[k];
                v = id[x][y];
                if (map[u][v] == -1 && id[x][y])
                    add(u, v, 1);
            }
        }
    }
    printf("%d\n", bfs());
    return 0;
}
7-35 c++(g++) ×

7-36 c++(g++) ×

7-37 c++(g++)
#include <stdio.h>
#include <string.h>
int main()
{
    char str[20][10],t[20],str1[10];
    int i,j,n=0;
    while(1)
    {
        scanf("%s",str1);
        if(str1[0]=='#')
        {
            break;
        }
        else
        {
        strcpy(str[n],str1);
        n++;
        }
    }
    for(i=0;i<n-1;i++)
        for(j=0;j<n-i-1;j++)
        {
            if(strlen(str[j])>strlen(str[j+1]))
            {
               strcpy(t,str[j]);
               strcpy(str[j],str[j+1]);
               strcpy(str[j+1],t);
            }
        }
    for(i=0;i<n;i++)
    {
        printf("%s ",str[i]);
    }
    return 0;
}
7-38 c++(g++)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<climits>
using namespace std;
bool cmp(double a,double b){
    return a > b;
}
int main(){
    int n,k,m,a,mx,mn,kx;
    double sum,arr[10001];
    scanf("%d%d%d",&n,&k,&m);
    memset(arr,0,sizeof(arr));
    kx = 0;
    for(int i = 0;i < n;i++){
        mx = INT_MIN,mn = INT_MAX,sum = 0;
        for(int d = 0;d < k;d++){
            scanf("%d",&a);
            mx = max(a,mx);
            mn = min(a,mn);
            sum += a;
        }       
        sum = sum - mx - mn;
        arr[kx++] = sum / (k - 2);
    }
    sort(arr,arr + kx,cmp);
    for(int i = m - 1;i >= 0;i--){
        if(i)
            printf("%.3lf ",arr[i]);
        else
            printf("%.3lf\n",arr[i]);
    }
    return 0;
}

7-39 c++(g++)
#include <iostream>
using namespace std;
int main()
{
    int n,i,j,k,p;
    int a[100][100];
    cin>>n;
    for(i=1;i<=n;i++)
    {
        a[i][i]=0;
    }
    for(i=1;i<=n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            cin>>a[i][j];
        }
    }
    for(i=2;i<=n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            k=j-i;
            for(p=k;p<j;p++)
            {
                if(a[k][j]>a[k][p]+a[p][j])
                a[k][j]=a[k][p]+a[p][j];
            }
        }
    }
    cout<<a[1][n]<<endl;
    return 0;
}
7-40 c++(g++)
#include<iostream>
#include<queue>
using namespace std;
int main()
{
    int n,m;
    priority_queue< int, vector<int>, greater<int> > q;    
    cin>>n;                                  
    for(int i=0;i<n;i++)                        
    {
        cin>>m;
        q.push(m);
    }
    int sum =0;
    while(!q.empty())
    {
        int x = q.top();
        q.pop();
        if(q.empty())
            break;
        int y = q.top();
        q.pop();
        x+=y;
        sum+=x;
        q.push(x);
    }
    cout<<sum<<endl;
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/JUSTDOINS/p/12084627.html
今日推荐