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; }