码迷,mamicode.com
首页 > 其他好文 > 详细

BestCoder Round #32

时间:2015-03-08 15:26:43      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

问题描述
目前,我们用PM2.5的含量来描述空气质量的好坏。一个城市的PM2.5含量越低,它的空气质量就越好。所以我们经常按照PM2.5的含量从小到大对城市排序。一些时候某个城市的排名可能上升,但是他的PM2.5的含量也上升了。这就意味着他的空气质量并没有改善。所以这样的排序方式是不合理的。为了使得排序合理,我们提出了一个新的排序方法。我们按照两个PM2.5含量测量的差值(第一次-第二次)来对他们按降序排序,如果有重复,按照第二次的测量值升序排序,如果还有重复,按照输入的顺序排序。
输入描述
多组测试数据(大概100组),每一组测试数据第一行先给出一个整数n,代表有n个城市需要被排序。城市被从0n1标号。接下来n行,每一含有两个整数代表每一个城市第一次和第二次被测量的PM2.5值。第i行描述城市i1的信息。
请处理到文件末尾。
[参数说明]
所有整数都在[1,100]的范围内。
输出描述
对于每一个数据,输出排好序之后的城市ID。
输入样例
2
100 1
1 2
3
100 50
3 4
1 2
输出样例
0 1
0 2 1

思路:三关键词排序

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define maxn 1000
 5 char ch[maxn];
 6 using namespace std;
 7 struct T
 8 {
 9     int x;int y;int z;
10 }a[maxn];
11 int cmp(T x,T y)
12 {
13     return ((x.x>y.x) ||((x.x==y.x && (x.y<y.y))) || (x.x==y.x && x.y==y.y && (x.z<y.z)));
14 }
15 int main()
16 {
17     int n,x,y;
18     while(scanf("%d",&n)!=EOF)
19     {
20         for(int i=1;i<=n;i++)
21         {
22             scanf("%d%d",&x,&y);
23             a[i].x=x-y;
24             a[i].y=y;
25             a[i].z=i-1;
26         }
27         sort(a+1,a+1+n,cmp);
28         for(int i=1;i<n;i++)
29         {
30             printf("%d ",a[i].z);
31         }
32         printf("%d\n",a[n].z);
33     }
34     return 0;
35 }
View Code
问题描述
给定一个数组(a0,a1,a2,?an1)和一个整数K, 请来判断一下是否存在二元组(i,j)(0ij<n)使得 NPsum(i,j) 刚好为K。这里NPsum(i,j)=aiai+1+ai+2+?+(1)jiaj
输入描述
多组测试数据。在文件的第一行给出一个T,表示有T组数据。
在接下来的2T行里,将会给出每一组数据。
每一组数据占两行,第一行包含nK。
第二行包含(a0,a1,a2,?an1)以一个空格分开。
[参数说明]
所有输入均为整数。
0<T25,1n1000000,1000000000ai1000000000,1000000000K1000000000
输出描述
对于每一个数据,输出占一行,输出格式是Case #id: ans,这儿id是数据编号,从1开始,ans是根据是否找到满足的二元组而定为“Yes.” 或 “No.” (不包含引号)
看样例可以获得更多的信息。
输入样例
2
1 1
1
2 1
-1 0
输出样例
Case #1: Yes.
Case #2: No.
Hint
如果数据比较多,建议使用快速读入

思路: 比赛的时候认为这个规模带log的都会卡,不然直接map了,然后学了种挂链表的神奇的HASH

技术分享
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #define maxn 1000009
 5 #define MOD 10000009
 6 using namespace std;
 7 int head[MOD+10],nex[maxn],a[maxn];
 8 long long point[maxn],now=0,sum[maxn];
 9 long long n,k;
10 int add(int x,int y)
11 {
12     nex[++now]=head[x];
13     head[x]=now;
14     point[now]=y;
15 }
16 void insert(long long x)
17 {
18     long long u=x%MOD;if(u<0)u*=-1;
19     for(int i=head[u];i;i=nex[i])
20     {
21         if(point[i]==x)return;
22     }
23     add(u,x);
24 }
25 int find(long long x)
26 {
27     long long u=x%MOD;if(u<0)u*=-1;
28     for(int i=head[u];i;i=nex[i])
29     {
30         if(point[i]==x)return 1;
31     }
32     return 0;
33 }
34 long long read()
35 {
36     long long x=0,f=1;char ch=getchar();
37     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
38     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
39     return x*f;
40 }
41 int main()
42 {
43     int t,cas=0;
44     t=read();
45     while(t--)
46     {
47         n=read();k=read();
48         for(int i=1;i<=n;i++)a[n-i+1]=read();
49         for(int i=1;i<=n;i++)
50         {
51             if(i&1)
52             {
53                 sum[i]=sum[i-1]+a[i];
54             }else sum[i]=sum[i-1]-a[i];
55         }    
56         int flag=0;
57         insert(0);
58         for(int i=1;i<=n;i++)
59         {
60             if(i&1)
61             {
62                 if(find(sum[i]-k)){flag=1;break;}
63             }
64             else if(find(sum[i]+k)){flag=1;break;}
65             insert(sum[i]);
66         }
67         printf("Case #%d: ",++cas);
68         if(flag)printf("Yes.\n");
69         else printf("No.\n");
70         memset(head,0,sizeof(head));
71         now=0;
72     }
73     return 0;
74 }
View Code

 

BestCoder Round #32

标签:

原文地址:http://www.cnblogs.com/philippica/p/4321679.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!