多校第八场
HDU 4950 Monster
小模拟题。找到推断的临界条件。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; __int64 h,a,b,k,sum; int main() {int i=0;while(scanf("%I64d%I64d%I64d%I64d",&h,&a,&b,&k)&&(a+b+h+k)){i++;bool flag=0;sum=h;if(a>=h) flag=1;if(sum-k*a+(k-1)*b<1) flag=1;if(a*k-b*(k+1)>0) flag=1;if(flag==1)cout<<"Case #"<<i<<": YES"<<endl;else cout<<"Case #"<<i<<": NO"<<endl;}return 0; }
HDU 4952 Number Transformation
这个题的数据量是比較大的,要是直接暴搞的话肯定是会T的。可是打表之后就发现了规律;
#include<iostream> #include<cstdio> using namespace std; __int64 x,k; int main() {int i=0;while(scanf("%I64d%I64d",&x,&k)&&(x+k)){__int64 y;int t=0;for(int i=2;i<=k;i++){if(x%i){if(t>100) break;y=x/i;y++;x=y*i;y=x/i;t++;cout<<i<<" "<<y<<" "<<x<<endl;}}}return 0; }
发现到x/(i+1)小于i+1之后。x/(i+1)的值是不会变化的;
事实上官方是有公式证明的;
以下是代码。
#include<iostream> #include<cstdio> using namespace std; __int64 x,k; int main() {int j=0;while(scanf("%I64d%I64d",&x,&k)&&(x+k)){__int64 y;j++;bool flag=0;for(int i=2; i<=k; i++){if(x%i){y=x/i;y++;x=y*i;y=x/i;if(y<i){flag=1;break;}}}if(flag==1) printf("Case #%d: %I64d\n",j,y*k);else printf("Case #%d: %I64d\n",j,x);}return 0; }
转载于:https://www.cnblogs.com/zsychanpin/p/7131609.html
总结
- 上一篇: TRUNCATE,DELETE,DROP
- 下一篇: 15_activity生命周期方法说明