网络赛水题

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4272

一开始看确实很简单的,但是晕死的题意距离坑了很多人。。

View Code
 1 typedef long long ll;
 2 const int N = 1010;
 3 int a[N];
 4 int main()
 5 {
 6     int n,i,j;
 7     //freopen("data.txt","r",stdin);
 8     while(scanf("%d",&n) != EOF)
 9     {
10         for(i = 0; i < n; i++)
11         scanf("%d",&a[i]);
12         if(n % 2)
13         {
14             printf("0\n");continue;
15         }
16         int flag;
17         for(i = 0; i < n; i++)
18         {
19             int sum = 0;
20             flag = 0;
21             for(j = i + 1; j < n && sum < 8; j++)
22             {
23                 if(a[j] == a[i])
24                 {
25                     flag = 1;
26                     for(int k = j; k > i + 1; k--)
27                     a[k] = a[k - 1];
28                     i++;
29                     break;
30                 }
31                 sum ++;
32             }
33             if(!flag) break;
34         }
35         if(!flag) printf("0\n");
36         else printf("1\n");
37     }
38     return 0;
39 }

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4273

一个计算几何的题目。poj上有个类似题目,都是用这个模板。不会做,赛后搜的一个代码,改改交上去是对的,算是个模板题吧

搜的代码链接:http://hi.baidu.com/lccycc_acm/item/1fed873d08776b607c034bd2

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4278

题意:计程器坏了,凡是遇到3 和 8 就会向前跳一个数,给出计程器显示的数,求出真实的数

题目是HG写的,昨天晚上看网上人都是写的从 8 进制转换为 10 进制,我就 2 的在那推规律,找了好长时间,不过还好真的有规律(0 到 100 内 跳过的数,0 到 1000 跳过的数 ~~~~)打出表,然后再计算,麻烦有点

View Code
 1 typedef long long ll;
 2 const int N = 1010;
 3 int a[9] = {0,2,36,488,5904,67232,737856,7902848,83222784};
 4 int pows(int n)
 5 {
 6     int i;
 7     int tem = 1;
 8     for(i = 0; i < n; i++)
 9     tem *= 10;
10     return tem;
11 }
12 int main()
13 {
14     int n;
15     int len;
16     //freopen("data.txt","r",stdin);
17     while(scanf("%d",&n), n)
18     {
19         int tem = n;
20         int ttem = n;
21         len = 0;
22         while(tem)
23         {
24             tem /= 10;
25             len ++;
26         }
27         //cout<<"len = "<<len<<endl;
28         int tsum = 0;
29         while(len)
30         {
31             int kem = n / pows(len - 1);
32             //cout<<"kem = "<<kem<<endl;
33             n %= pows(len - 1);
34             //cout<<"n = "<<n<<endl;
35             if(kem == 0) {len --; continue;}
36             if(len == 1)
37             {
38                 if(kem > 8) tsum += 2;
39                 else if(kem > 3) tsum += 1;
40             }
41             else
42             {
43                 if(kem > 8) {tsum += (kem - 2) * a[len - 1] + 2 * pows(len) / 10;}
44                 else if(kem > 3) {tsum += (kem - 1) * a[len - 1] + pows(len) / 10;}
45                 else {tsum += (kem) * a[len - 1];}
46             }
47             //cout<<"stsum = "<<tsum<<endl;
48             len --;
49         }
50 
51         //cout<<"tsum = "<<tsum<<endl;
52         printf("%d: %d\n",ttem,ttem - tsum);
53     }
54     return 0;
55 }

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4282

如果能想到 当 z = 2 时,那个表达式是个完全平方式,那么 z 就可以从 3 开始枚举 到 31,因为 y > x 所以,而且是 幂运算,暴力枚举 x 最多到 1400,所以完全可以过

View Code
 1 typedef long long ll;
 2 ll pows(int x,int n)
 3 {
 4     int i;
 5     ll tem = 1;
 6     for(i = 0; i < n; i++)
 7     tem *= x;
 8     return tem;
 9 }
10 int main()
11 {
12     int z;
13     ll x,y;
14     int n;
15     //freopen("data.txt","r",stdin);
16     while(scanf("%d",&n), n)
17     {
18         int sum = 0;
19         int tem = sqrt(n * 1.0);
20         if(tem * tem == n) // 如果是完全平方,先计算
21         sum += (tem - 1) / 2;
22         for(z = 3; z < 31; z ++)
23         {
24             x = 1;
25             while(1)
26             {
27                 ll temp = pows(x,z);
28                 if(temp / 2 >= n) break;  // 加判断
29                 y = x + 1;
30                 while(1)
31                 {
32                     ll kemp = pows(y,z);
33                     if(temp + kemp + x * y * z > n) break;  // 判断
34                     else if(temp + kemp + x * y * z == n) sum++;  // 其实这里也可以加个判断,因为一旦找到了,肯定不用往后面枚举 y 了
35                     y++;
36                 }
37                 x++;
38             }
39         }
40         printf("%d\n",sum);
41     }
42     return 0;
43 }

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4287

题意:给出手机键上的字母,按下一串数字,然后给出一些单词,问没一个数字串命中的单词个数有几个

简单的计算,把每个手机键上的字母当成权值一样,然后计算每个字符串的权值,与上面给的数字串去匹配

View Code
 1 typedef long long ll;
 2 const int N = 5010;
 3 int num[N];
 4 int sum[1000000];
 5 int a[26] = {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};
 6 int main()
 7 {
 8     int n,m;
 9     int t,i,j;
10     char str[10];
11     //freopen("data.txt","r",stdin);
12     scanf("%d",&t);
13     while(t--)
14     {
15         scanf("%d%d",&n,&m);
16         for(i = 0; i < n;i++)
17         scanf("%d",&num[i]);
18         _clr(sum,0);
19         for(i = 0; i < m; i++)
20         {
21             int tsum = 0;
22             cin>>str;
23             int len = strlen(str);
24             for(j = 0; j < len; j++)
25             //for(i = 0; i < len; i++)
26             {
27                 tsum = tsum * 10 + (a[str[j] - 'a']);
28             }
29             sum[tsum] ++;
30         }
31         for(i = 0; i < n; i++)
32         printf("%d\n",sum[num[i]]);
33     }
34     return 0;
35 }
原文地址:https://www.cnblogs.com/fxh19911107/p/2678501.html