130331周赛
A. Roma and Changing Signs
此题最希望的是能把所有的负数都变成正数,当负数个数>=操作数,由小到大变正;当负数个数<操作数时,剩下的操作数只对最小的操作。
[cpp]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int n,k;
int a[100005];
int main()
{
int i,j;
while(cin >> n >> k)
{
int cnt = 0;
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
if(a[i] < 0)
cnt ++;
}
if(cnt >= k)
{
for(i=0; i<k; i++)
a[i] = -a[i];
}
int t = 0;
if(cnt < k)
{
for(i=0; i<cnt; i++)
a[i] = -a[i];
t = (k - cnt) % 2;
sort(a,a+n);
if(t == 1)
a[0] = -a[0];
}
long long sum = 0;
for(i=0; i<n; i++)
sum += a[i];
cout << sum << endl;
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int n,k;
int a[100005];
int main()
{
int i,j;
while(cin >> n >> k)
{
int cnt = 0;
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
if(a[i] < 0)
cnt ++;
}
if(cnt >= k)
{
for(i=0; i<k; i++)
a[i] = -a[i];
}
int t = 0;
if(cnt < k)
{
for(i=0; i<cnt; i++)
a[i] = -a[i];
t = (k - cnt) % 2;
sort(a,a+n);
if(t == 1)
a[0] = -a[0];
}
long long sum = 0;
for(i=0; i<n; i++)
sum += a[i];
cout << sum << endl;
}
return 0;
}
B. Maxim and Discounts
活动有几种,买n送2,贪心的角度,选择n最小的。因为送的两件商品价格必须低于买的n件,所以将商品从大到小排序。
[cpp]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
int n,m;
int a[100005],q[100005];
bool cmp(int a,int b)
{
return a > b;
}
int main()
{
int i,j;
while(cin >> m)
{
int minm = 100000000;
for(i=0; i<m; i++)
{
scanf("%d",&q[i]);
if(minm > q[i])
minm = q[i];
}
cin >> n;
for(i=0; i<n; i++)
scanf("%d",&a[i]);
sort(a,a+n,cmp);
int sum = 0,cnt = minm,tmp = 0;
for(int i=0; i<n; i++)
{
if(tmp > 0)
{
tmp --;
cnt = minm;
continue;
}
cnt --;
&nbs
补充:软件开发 , C++ ,