多校第八场
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生命周期方法说明