网站:CSUST夜间活动4
A 找到规律就好,奇数就N-1,偶数就无解 Coins POJ 3210
原因: 来自:依然
思路:若n为偶数:
1: 若初始状态为偶数正面 + 偶数反面,要想变成全正或全反,翻转的次数必为偶数。
例如: ○○●●●● 则翻转 2,4,6,8……次均可。
2: 若初始状态为奇数正面 + 奇数反面,要想变成全正或全反,翻转的次数必为奇数。
例如: ○○○○○● 则翻转 1,3(先将●翻为○,再将任一个○翻两下),5,7……次均可。
因次,我们就无法得到一个确定的翻转次数x,让它能使任意初始状态的硬币变成全为正或全为反,因为若x为偶数,则无法满足例2,若x为奇数,则无法满足例1。故应输出"No Solution!"。
若n为奇数:
初始状态只可能为偶数正面 + 奇数反面(偶数反面 + 奇数正面同理),故要想变成全正或全反,是必能找出一个次数x满足所有任意情况的。
1:对初始状态即全为奇数个正面而言,翻转的次数必为偶数。
2: 由1得只能翻所有正面为反面,因为这样才需翻转偶数次。
例如: ○○○○●●● 则翻转4,6,8,10……次均可,其中最小为4。要保证对7枚硬币的任意初始状态都可行,则最小应为 7-1=6 ,否则对 ○○○○○○● 无法实现。
因此,当你为奇数是,最少翻转次数为n-1。
代码: 0ms
1 #include <stdio.h> 2 int main() 3 { 4 int n; 5 while(~scanf("%d",&n)&&n) 6 { 7 if(n%2) 8 printf("%d\n",n-1); 9 else 10 printf("No Solution!\n"); 11 } 12 return 0; 13 }
B 坑爹的题,刚开始各种超时,后来发现是有规律的,结果还是超时,那个k^t都不能用for,超时,又不能用pow,最后是用就奇偶数乘(是这个名字吧.....不记得了╮(╯▽╰)╭) 小明系列故事――师兄帮帮忙 HDU 4506
结果RE,运行错误,尼玛,不能用int ,long long ,一定要用__int64!!!!!!!!!!
代码: 31ms
1 #include <stdio.h> 2 #include <math.h> 3 #include <algorithm> 4 #include <iostream> 5 using namespace std; 6 int mod=1000000007; 7 __int64 a[10005],b[10005]; //一定要用__int64!!!!! 8 int main() 9 { 10 int T,i,e; 11 __int64 t,m,k,sum,n; 12 scanf("%d",&T); 13 while(T--) 14 { 15 sum=1; 16 scanf("%I64d%I64d%I64d",&n,&t,&k); 17 for(i=1;i<=n;i++) 18 scanf("%I64d",&a[i]); 19 m=t; 20 while(t>0) //(奇偶数乘) 21 { 22 if(t%2) 23 sum=(sum*k)%mod; 24 t/=2; 25 k=k*k%mod; 26 } 27 m%=n; //这一步很重要,这决定了你后面的n+i-m会是正数 28 for(i=1;i<=n;i++) 29 { 30 if(i-m<=0) //<=0 31 e=n+i-m; 32 else 33 e=i-m; //>0 34 b[i]=(a[e]*sum)%mod; 35 } 36 37 for(i=1;i<n;i++) 38 printf("%I64d ",b[i]); 39 printf("%I64d\n",b[n]); 40 } 41 return 0; 42 }
C 以前做过的......那是后没做出来......现在还是没,虽然有思路了......死于夭折.....╮(╯▽╰)╭ 饭卡 HDU 2546
1 #include <stdio.h> 2 #include <iostream> 3 #include <algorithm> 4 #include <string.h> 5 using namespace std; 6 #define inf (0x7f7f7f7f) 7 const int maxn = 1005; 8 int main() 9 { 10 int n, val[maxn], m, dp[maxn]; 11 while (scanf("%d", &n)&&n) 12 { 13 int i,j; 14 for (i=0; i<n; i++) 15 scanf("%d", &val[i]); 16 scanf("%d", &m); 17 memset(dp, 0, sizeof(dp)); 18 sort(val, val+n); //排序 19 if (m >= 5) //大于5 20 { 21 for (i=0; i<n-1; i++) 22 for (j=m-5; j>=val[i]; j--) //留下5块,买最贵的 23 dp[j] = max(dp[j], dp[j-val[i]] + val[i]); 24 printf("%d\n", m - dp[m-5] - val[n-1]); 25 } 26 else 27 printf("%d\n", m); 28 } 29 return 0; 30 }
D 不想写 T^T看到网上的代码就傻了...... Ignatius and the Princess I HDU 1026