2021浙江省赛
C 正方体比例: 1:2:3(未开根号)
直接8个点两两算边~
12/12/4
而且长度符合1,2,3比例(我的距离没有开方,实际上是1,√2,√3)
#include<bits stdc++.h>
using namespace std;
int const N=107;
int t;
struct L{
int x,y,z;
}a[N];
int pan(L a,L b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)
+(a.z-b.z)*(a.z-b.z);
}
map<int,int>mp;
map<int,int>::iterator it;
int main(){
cin >> t;
while(t--){
memset(a,0,sizeof a);
for(int i=1;i<=8;++i){
cin >> a[i].x >> a[i].y >> a[i].z;
}
for(int i=1;i<=8;++i){
for(int j=1;j<=8;++j){
if(i==j) continue;
int z=pan(a[i],a[j]);
mp[z]++;
}
}
it=mp.begin();
int z=it->first;
if(mp.size()==3&&mp[z]==24&&mp[z*2]==24&&mp[z*3]==8){
cout << "YES\n";
}
else cout << "NO\n";
mp.clear();
}
return 0;
}J dijstra + 完全背包
每次只能拿一个 + 无限数量 + 时间代价 (完全背包)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int const N=3e3+7;
int const M=3e3+7;
struct node{
int a,next,len;
}e[M<<1];
int cnt,head[N];
void add(int x,int y,int len){
e[++cnt].a =y;
e[cnt].len=len;
e[cnt].next =head[x];
head[x]=cnt;
}
struct L{
int a,dis;
friend bool operator<(L a,L b){
return a.dis > b.dis;
}
};
int n,m,t;
int vis[N],dis[N];
void dijstra(int s){
memset(dis,0x3f,sizeof dis);
priority_queue<L>pq;
pq.push((L){s,0});dis[s]=0;
while(!pq.empty()){
int u=pq.top().a;pq.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i!=0;i=e[i].next){
if(vis[e[i].a]) continue;
if(dis[u]+e[i].len<dis[e[i].a]){
dis[e[i].a]=dis[u]+e[i].len*2;
pq.push((L){e[i].a,dis[e[i].a]});
}
}
}
}
ll f[M];
int w[N];
int main(){
cin >> n >> m >> t;
for(int i=2;i<=n;++i) cin >> w[i];
for(int i=1;i<=m;++i){
int a,b; cin >> a >> b;
add(a,b,1);add(b,a,1);
}
dijstra(1);
m=t;
for(int i=2;i<=n;++i){
for(int j=dis[i];j<=m;++j){
f[j]=max(f[j],f[j-dis[i]]+w[i]);
}
}
for(int i=1;i<=m;++i){
cout << f[i] << " ";
}
return 0;
}