标签:while contains data lines prepare ... case std memory
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11244 Accepted Submission(s): 4627
3 5 4 9 5 2 2 1 3 5 1 4 3 2 2 1 1 2 2 3 1 3 2 2 3 1
2 1 3
题意是第一个3是3组数据, 然后一个5是5根棍子。 然后逐一输入其的长度和重量。
。题目是问怎么做这些棍子用时最少,在做棍子时。若后一根棍子。长度和重量都大于前
一根。则不用加时间。。
想法。。
拿第一组数据来说。
。
首先按长度以小到大排序:(1,4),(2,1),(3。 5)。 (4, 9),(5,2);
我们发现(2。 1)的重量太小, 而(5, 2)的长度太长。这样排结果为3;
事实上这时,我们仅仅要把不满足的先标记起来。
。
则(1,4)。(3,5),(4,9) ———— (2,1), (5,2)
但我们这么排, 也就是题目给出的顺序,结果就为2;也就是最优。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<sstream> #include<cmath> using namespace std; #define M 100500 struct node { int lenth; int weight; int k; } Q[M]; bool cmp ( node a, node b ) { if(a.lenth==b.lenth) return a.weight<b.weight; else return a.lenth<b.lenth; } int main() { int t; int n; scanf("%d", &t); while( t-- ) { scanf("%d", &n); for(int i=0; i<n; i++) { scanf("%d%d", &Q[i].lenth, &Q[i].weight); Q[i].k= 1; } sort( Q, Q+n, cmp ); int ans = 0; for(int i=0; i<n-1; i++) { if(!Q[i].k) continue; int t = Q[i].weight; for(int j = i+1; j<n; j++) if(Q[j].weight>=t &&Q[j].k==1 ) { ans++; Q[j].k=0; t = Q[j].weight; } } printf("%d\n", n-ans); } return 0; }
标签:while contains data lines prepare ... case std memory
原文地址:http://www.cnblogs.com/wzjhoutai/p/6970774.html