这次的题目除了第四题和最后一题,都是贪心题。
1.3.1 Moving Tables
策略:将处于对面的当作是同一个位置,每次占用在相应的位置加一,全部数完之后求出最大的占用的那个值,就是最大的时间了。开始出现的错误是没有分开求占用。
1.3.2 今年暑假不AC
策略:先拍结束时间,从小到大排序。在比较开始时间与上一次的结束时间。大于的表示可以。
1.3.3Tian Ji -- The Horse Racing
策略:
先排序。
首先比较最低的,前者的最低大于后者,直接比赛。
前者的最低小于后者,前者的最低与后者的最高比赛。
前者的最低等于后者的最低时:再比较两者的最高,
若前者的最高高于后者的最高,那么直接前者的最低与后者的最低比赛,前者的最高与后者的最高比赛。
若前者的最高低于后者的最低,那么直接前者的最低与后者的最高比赛。
若前者的最高等于后者的最高,那么再比较前者的最低与后者的最高,若相等,则全部相等。若小于,那么前者的最低与后者的最高比赛。
开始的做法忽略了等于的时候的若干种请款
1.3.4 第二小整数
求得最大和第二大,输出第二大。
1.3.5 Saving HDU
策略:单位体积价格非增排序,从头开始。
1.3.6 悼念512汶川大地震遇难同胞——老人是真饿了
策略:大米单价非减排序,从头开始取。
1.3.7 Crixalis's Equipment
策略:计算需要体积和占用体积的差值,将差值从从大到小排序,当差值相同时,选择需要体积大的排在前面。(但是这里有没有都是一样过了),然后从头开始取。
1.3.8 Who's in the Middle
排序,去中位值。(开始的做法是只有一组,然后一直报错。可是题目本身也没说有很多组啊!)
1.3.1
#include <bits/stdc++.h>
using namespace std;
int a[1100], b[1100];
int main()
{
int n;
while(cin >> n && n != 0)
{
for(int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a+n);
for(int i = 0; i < n; i++)
{
cin >> b[i];
}
sort(b, b+n);
int ha = n-1, hb = n-1;
int la = 0, lb = 0;
int sum = 0;
int i = 0, j = 0;
while(ha >= la && hb >= lb)
{
if(a[la] > b[lb])
{
la++;
lb++;
sum += 200;
}
else if(a[la] < b[lb])
{
la++;
hb--;
sum -= 200;
}
else
{
if(a[ha] > b[hb])
{
ha--;
hb--;
sum += 200;
}
else if(a[ha] < b[hb])
{
hb--;
la++;
sum -= 200;
}
else
{
if(a[la] < b[hb])
{
sum -= 200;
la++;
hb--;
}
else if(a[la] == b[hb])
{
break;
}
}
}
}
cout << sum << endl;
}
return 0;
}
1.3.4
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
int maxn, second_maxn;
int a;
cin >> maxn >> second_maxn;
n--;
n--;
if(maxn > second_maxn)
{
swap(maxn, second_maxn);
}
while(n--)
{
cin >> a;
if(a <= maxn)
{
maxn = a;
}
else if(a > maxn && a < second_maxn)
{
second_maxn = a;
}
}
cout << second_maxn << endl;
}
return 0;
}
1.3.5
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1100;
struct treasure1
{
int pi, mi;
};
treasure1 treasure[maxn];
bool cmp (treasure1 a, treasure1 b)
{
return a.pi > b.pi;
}
int main()
{
int v, n;
while(cin >> v && v != 0)
{
cin >> n;
int sum = 0;
for(int i = 0; i < n; i++)
{
scanf("%d%d", &treasure[i].pi, &treasure[i].mi);
}
sort(treasure, treasure+n, cmp);
for(int i = 0; i < n && v > 0; i++)
{
if(treasure[i].mi <= v)
{
v = v - treasure[i].mi;
sum += treasure[i].pi * treasure[i].mi;
}
else
{
sum += treasure[i].pi * v;
v = 0;
}
}
printf("%d\n", sum);
}
}
1.3.6
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
struct dot
{
double a, b;
};
dot dot1[maxn];
bool cmp(dot i, dot j)
{
return i.a < j.a;
}
int main()
{
int t;
cin >> t;
while(t--)
{
double money;
int num;
double sum = 0;
cin >> money >> num;
for(int i = 0; i < num; i++)
{
scanf("%lf%lf", &dot1[i].a, &dot1[i].b);
}
sort(dot1, dot1+num, cmp);
for(int i = 0; i < num && money != 0; i++)
{
if(money > dot1[i].a*dot1[i].b)
{
sum += dot1[i].b;
money -= dot1[i].a*dot1[i].b;
}
else
{
sum += (money/dot1[i].a);
break;
}
}
printf("%.2f\n", sum);
}
return 0;
}
1.3.7
#include <bits/stdc++.h>
using namespace std;
struct cost
{
int take, need;
};
cost cost1[10100];
bool cmp(cost a, cost b)
{
if(a.need - a.take != b.need - b.take)
return a.need - a.take > b.need - b.take;
else
return a.need > b.need;
}
int main()
{
int t;
cin >> t;
while(t--)
{
int take1, n;
cin >> take1 >> n;
for(int i = 0; i < n; i++)
{
scanf("%d%d", &cost1[i].take, &cost1[i].need);
}
sort(cost1, cost1+n, cmp);
int flag = 0;
for(int i = 0; i < n; i++)
{
if(cost1[i].need > take1 || cost1[i].take > take1)
{
flag = 1;
break;
}
else
{
take1 = take1 - cost1[i].take;
}
}
if(flag == 0)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
return 0;
}
1.3.8
#include <bits/stdc++.h>
using namespace std;
int a[10010];
int main()
{
int n;
while(cin >> n)
{
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
sort(a, a+n);
cout << a[(n-1)/2] << endl;
}
return 0;
}