A Minimum’s Revenge HDU - 5922(思维题)
给你一棵树,有n个节点,编号从1~n,每两个节点之间都有一条边权值为两个节点编号的最小公倍数。问最小生成树的权值和为多少?
简单题,最小公倍数是本身,即最小生成树为和(除1以外)
#include<cstdio>
typedef long long ll;
int main(){
int T,t=1;
scanf("%d",&T);
ll n;
while(T--){
scanf("%lld",&n);
printf("Case #%d: %lld\n",t++,n*(n+2)/2-1);
}
return 0;
}
C Mr. Frog’s Problem HDU - 5924(思维题)
给两个数A,B,找到所有的C,D满足其表达式
。
由于A,B是区间的两个端点,所以A/B + B/A 已经就是最大值了。
所以当A=B 时答案就是A,B;当不相等时,答案为A,B和B,A
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
int T,t=1;
ll x,y;
scanf("%d",&T);
while(T--){
scanf("%lld %lld",&x,&y);
printf("Case #%d:\n",t++);
if(x>y) swap(x,y);
if(x==y){
printf("1\n%lld %lld\n",x,y);
}
else {
printf("2\n%lld %lld\n",x,y);
printf("%lld %lld\n",y,x);
}
}
return 0;
}
E Mr. Frog’s Game HDU - 5926(思维题)
相同的格子只有相连或者在同一台边上的才能消掉,问图中是否有能消掉的格子。
判断边上和内部即可。
#include<cstdio>
int a[35][35];
int main(){
int T,n,m,t=1;
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
}
int cnt=0;
for(int i=0;i<m;i++) //第一行
for(int j=i+1;j<m;j++)
if(a[0][i]==a[0][j])
cnt++;
for(int i=0;i<m;i++) //最后一行
for(int j=i+1;j<m;j++)
if(a[m-1][i]==a[m-1][j])
cnt++;
for(int i=0;i<n;i++) //第一列
for(int j=i+1;j<n;j++)
if(a[i][0]==a[j][0])
cnt++;
for(int i=0;i<n;i++) //最后一列
for(int j=i+1;j<n;j++)
if(a[i][n-1]==a[j][n-1])
cnt++;
if(cnt>0)
printf("Case #%d: Yes\n",t++);
else{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(a[i][j]==a[i+1][j]||a[i][j]==a[i][j+1])
cnt++;
if(cnt>0)
printf("Case #%d: Yes\n",t++);
else
printf("Case #%d: No\n",t++);
}
}
}
本文解析了三道经典的思维题,包括最小生成树问题、区间端点表达式问题及格子消除游戏。通过深入分析,提供了简洁的算法实现,帮助读者理解并掌握解题思路。
5009

被折叠的 条评论
为什么被折叠?



