8月13号小练

网站: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 }
View Code

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

你可能感兴趣的:(8月13号小练)