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-1);
 9         else
10             printf("No Solution!
");
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
",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
", m - dp[m-5] - val[n-1]);
25         }
26         else
27             printf("%d
", m);
28     }
29     return 0;
30 }

D    不想写 T^T看到网上的代码就傻了......    Ignatius and the Princess I      HDU 1026

原文地址:https://www.cnblogs.com/riddle/p/3256966.html