HDU 4393 Throw nails(貪欲にシミュレーションを加え、問題を追究する)
9468 ワード
テーマリンク:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115361#problem/D
最大50000人を与え、最初の速度Fと1秒後の速度Vを与え、(F<=500、V==100)毎秒で一番速い人を淘汰し、淘汰した人の順番で彼らの番号を出力します。
人数が多いので、暴力的に更新して、毎秒淘汰する人は明らかにTLEができます。Fが小さいことに気づいたら、どの二人にとっても、500キロの差があっても、そのスピードが速い人は毎秒1メートルしかないです。501秒後に超えることができます。つまり、501秒後にスピードが速い人はずっと速い地位にあります。同じスピードの人はFサイズの先に淘汰されます。同じ番号で先に淘汰すればいいです。501秒以降はこの方法で順番を並べばいいです。501秒以内であれば、暴力シミュレーションは毎秒淘汰されます。
もちろん、これはFの範囲によって考えたので、Vの範囲が小さい方法はまだできません。
ACコードは以下の通りです。
転載先:https://www.cnblogs.com/zzyDS/p/5474026.html
最大50000人を与え、最初の速度Fと1秒後の速度Vを与え、(F<=500、V==100)毎秒で一番速い人を淘汰し、淘汰した人の順番で彼らの番号を出力します。
人数が多いので、暴力的に更新して、毎秒淘汰する人は明らかにTLEができます。Fが小さいことに気づいたら、どの二人にとっても、500キロの差があっても、そのスピードが速い人は毎秒1メートルしかないです。501秒後に超えることができます。つまり、501秒後にスピードが速い人はずっと速い地位にあります。同じスピードの人はFサイズの先に淘汰されます。同じ番号で先に淘汰すればいいです。501秒以降はこの方法で順番を並べばいいです。501秒以内であれば、暴力シミュレーションは毎秒淘汰されます。
もちろん、これはFの範囲によって考えたので、Vの範囲が小さい方法はまだできません。
ACコードは以下の通りです。
1 #include
2 #include
3 #include <set>
4 #include <string.h>
5 using namespace std;
6 struct node
7 {
8 int id;
9 int v;
10 int f;
11 int s;
12 }P[50000+5];
13 int tot;
14 bool cmp(node A,node B)
15 {
16 if(A.v==B.v)
17 {
18 if(A.f==B.f)
19 {
20 return A.id<B.id;
21 }
22 else return A.f>B.f;
23 }
24 else return A.v>B.v;
25 }
26
27 int main()
28 {
29 int T;
30 scanf("%d",&T);
31 for(int kace=1;kace<=T;kace++)
32 {
33 tot=0;
34 int n;
35 scanf("%d",&n);
36 for(int i=1;i<=n;i++)
37 {
38 int f,v;
39 scanf("%d%d",&f,&v);
40 P[++tot]=(node){i,v,f,f};
41 }
42 printf("Case #%d:
",kace);
43 for(int i=1;i<=501;i++)
44 {
45 if(i>n) break;
46 int id=1;
47 int maxsum=-1;
48 for(int j=1;j<=tot;j++)
49 {
50 if(i!=1&&P[j].s!=-1) P[j].s+=P[j].v;
51 if(maxsumP[j].s;}
52 }
53 if(i!=1) printf(" ");
54 printf("%d",id);
55 P[id].s=P[id].f=P[id].v=-1;
56 }
57 sort(P+1,P+1+tot,cmp);
58 for(int i=1;i<=n-501;i++)
59 {
60 printf(" %d",P[i].id);
61 }
62 puts("");
63 }
64 return 0;
65 }
転載先:https://www.cnblogs.com/zzyDS/p/5474026.html