写这篇题解花了我很多不少时间,希望能过 awa
题意:
有 m m m 个数,这 m m m 个数能否由另外 n n n 个数通过加减运算获得。
对于每一次加减的操作,结果不能小于 0 0 0(角度不能小于 0 0 0);
对于大于等于 360 360 360 的结果,对 360 360 360 取模。(大于 36 0 ∘ 360^{\circ} 360∘ 的角会转一圈后继续转)
能则输出 YES ,不能则输出 NO 。
思路:
dp \texttt{dp} dp(背包)、搜索都可以。dp 太难想 这里我只讲搜索。
对于每一个状态,只有加和减两种状态。所以只需要对每一个状态枚举每一个数的加或减。
记录已经过状态,枚举中遇到了要获得的数,就表明可以实现。枚举结束后还没有遇到,则不能实现。
实现:
对于状态 x x x ,
拓展 ( x ± a [ i ] ) m o d 360 (x\pm a[i]) \bmod 360 (x±a[i])mod360 且 x ± a [ i ] ≥ 0 x\pm a[i]\ge0 x±a[i]≥0 且未被拓展过。
上代码!
#include<bits/stdc++.h> using namespace std; int n,m; int a[11],b; bool vis[361]; bool bfs(int end) {
memset(vis,0,sizeof(vis)); queue<int> q; q.push(0); vis[0]=true; while(!q.empty()) {
int t=q.front();q.pop(); if(t==end) {
return true; } for(int i=1;i<=n;i++) {
int cg=(t+a[i])%360; if(cg>=0&&(!vis[cg])) {
vis[cg]=true; q.push(cg); } //可以不枚举减法,文后给出证明过程 /*cg=(t-a[i])%360; if(cg>=0&&(!vis[cg])) { vis[cg]=true; q.push(cg); }*/ } } return false; } int main() {
cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++) {
cin>>b; if(bfs(b)) puts("YES"); else puts("NO"); } return 0; }
讯享网
完结。
对于可以不枚举 x − a x-a x−a 的证明:
对于任意正整数 x x x, a a a, k k k, p p p,证明:
( x + a k ) m o d 360 = x − a p (x+ak) \bmod 360 = x-ap (x+ak)mod360=x−ap。
x x x 指某一状态。意思就是,只用加 k k k 次 a a a 就可以枚举到 x − a p x-ap x−ap。
原式可转化为: 360 t + x − a p = x + a k 360t+x-ap=x+ak 360t+x−ap=x+ak, t t t 为任意正整数。
化简,得: 360 t = a ( p + k ) 360t=a(p+k) 360t=a(p+k)。
所以,只需证明 a ( p + k ) a(p+k) a(p+k) 恒为 360 360 360 倍数。
若 a a a 为 360 360 360 倍数,得证;
若 a a a 不为 360 360 360 倍数,
则若使 ( p + k ) (p+k) (p+k) 为 360 360 360 倍数, k = 360 − p k=360-p k=360−p 即可。
又有 x − a p ≥ 0 x-ap\ge0 x−ap≥0,则 p ≤ x a < 360 p\le \frac{x}{a}<360 p≤ax<360。
则 k k k 在满足 k = 360 − p k=360-p k=360−p 的条件下满足 k > 0 k>0 k>0,所以无论 p p p 取多少都能满足 ( p + k ) (p+k) (p+k) 为 360 360 360 倍数。得证。
综上, ( x + a k ) m o d 360 = x − a p (x+ak) \bmod 360 = x-ap (x+ak)mod360=x−ap。
第一次自己写 OI 证明题,有不对或不完善的地方请指出,谢谢qaq;
被打回x4 – 求过!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/74935.html