1001.AND Minimum Spanning Tree
题意:已知一个完全图,共有N个点,按1-N编号,点与点之间的边权为两点的编号相与,求权值和最小生成树,相同权值和输出最小的字典序方案
思路:为了保证可以得到权值和最小,对于每个点可以贪心的去找与其与值最小的点,为保证字典序最小,应找到第一个与其相与可以得到最小的点
方案:枚举每个点二进制位上最低0的位置,得到相遇的点,比如X的二进制位1110011110111,则与其相与的最小的点为1000,若用此方法找到的值比N值大,则将其与1相与
代码:
#include<bits/stdc++.h> using namespace std; const int maxn = 1e6+7; int b[maxn]; int main() { int n; int t; cin>>t; while(t--) { cin>>n; long long int ans=0; for(int i=2; i<=n; i++) { if(i%2==0) { b[i]=1; ans+=((i&1)*1ll); } else { int t=i; for(int j=0;j<=30;j++) { if((t&(1<<j))!=0) continue; else { if((1<<j)>n) { b[i]=1; } else { b[i]=1<<j; } ans+=((b[i]&i)*1ll); break; } } } } printf("%lld\n",ans); for(int i=2; i<=n; i++) { printf("%d%c",b[i],i==n?‘\n‘:‘ ‘); } } }
1007.Just an Old Puzzle
题意:类似于奇数码问题,问是否可以将一个图转化成另一个图
思路:裸题直接搞
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int mp[25],ans=0; 6 int t; 7 cin>>t; 8 while(t--) 9 { 10 ans=0; 11 memset(mp,0,sizeof(mp)); 12 for(int i=0; i<16; i++) 13 { 14 scanf("%d",&mp[i]); 15 if(!mp[i]) 16 ans+=6-i%4-i/4; 17 for(int j=0; j<i; j++) 18 if(mp[j]>mp[i]) 19 ans++; 20 } 21 if(ans&1) 22 puts("Yes"); 23 else 24 puts("No"); 25 } 26 27 }
1008.K-th Closest Distance
题意:给定一个数组,每次查询l-r区间之内与K距离第k近的元素,题目要求强制在线,每次输出答案为上一个的答案异或当前答案
思路:对于每个区间查询与K距离最近的元素,可以通过二分答案,查询当前区间处于[p-ans,p+ans]的数是否大于k个,同个check上述条件完成题目
1010.Minimal Power of Prime
题意:通过对于一个数,求解素因子权值的最小值
思路:待补
原文地址:https://www.cnblogs.com/plys/p/11279651.html
时间: 2024-11-11 21:56:11