hdu 5246 乱搞
题意:题目太长直接看链接
链接:点我
乱搞题
显然,一个人要想成功,必须大于等于最强的人的战斗力,所以我们从后往前看
这里直接拿例1解释,首先递减排个序
15,13,10,9,8
作差得2,3,1,1,
此时我们从10出发即可成功
同时也发现,战斗力逐渐递增和直接到某个值其实是等价的
于是我们假设战斗力是从15-13-10-9-8变化的,观察这种变化能否成功即可
由13到15,变化为2,则从13出发剩余战斗力至少得提高2
从10到13,战斗力要提高3,而k为3然后10小于m,即成功
看一下反例2:
8,9,10,13,16
作差得3,3,1,1
从13-16,战斗力至少要提高3,而战斗力最高才能提高3,所以必须从13出发才能成功,而13<m,则不能成功
题目还是比较好想的,只是自己描述的不太清楚
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 typedef long long ll; 13 #define cl(a) memset(a,0,sizeof(a)) 14 #define ts printf("*****\n"); 15 const int MAXN=10005; 16 int n,tt; 17 ll m; 18 long long a[MAXN],b[MAXN]; 19 bool cmp(ll x,ll y) 20 { 21 return x>y; 22 } 23 int main() 24 { 25 int i,j; 26 int k; 27 #ifndef ONLINE_JUDGE 28 freopen("1.in","r",stdin); 29 #endif 30 int ca=1; 31 scanf("%d",&tt); 32 while(tt--) 33 { 34 printf("Case #%d:\n",ca++); 35 scanf("%d%d%d",&n,&m,&k); 36 for(i=1;i<=n;i++) scanf("%I64d",&a[i]); 37 sort(a+1,a+1+n,cmp); 38 if(a[1]<=m) 39 { 40 printf("why am I so diao?\n"); 41 continue; 42 } 43 for(i=1;i<n;i++) 44 { 45 b[i]=a[i]-a[i+1]; 46 } 47 bool flag=0; 48 int K=k; 49 k=1; 50 for(i=1;i<n;i++) 51 { 52 if(k>=K) 53 { 54 if(a[i]<=m) 55 { 56 flag=1; 57 break; 58 } 59 else 60 { 61 flag=0; 62 break; 63 } 64 } 65 k=(int)b[i]; 66 } 67 if(i==n&&a[n]<=m) 68 { 69 flag=1; 70 } 71 if(!flag) 72 { 73 printf("madan!\n"); 74 } 75 else 76 printf("why am I so diao?\n"); 77 } 78 }