Codefores 398A Cards(贪心+暴力)
2014-03-05 13:40
204 查看
题目链接:Codefores 398A Cards
题目大意:给出a和b,表示说有a个“o”的卡和b个“x”的卡,将这a+b个卡片排成一个序列,每连续的k个相同的卡片为一个数,表示k^2,如果是o,则是+k^2,否则-k^2。要求找到一个序列使得最后的结果尽量大。
解题思路:一开始一直想用贪心的思想直接构造出来,后来和小伙伴一人想了一种构造方法,但是又互相推翻了。。。。不过很快就想到了暴力,因为b最多1e5,答案肯定要让o尽量在一起,x尽量分开,这样我们每次拿出一个o的卡片就可以让x被多分成一份,所以枚举x被分成的份数,贪心,尽量让o在一起。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll a, b, ans, v = 1;
ll solve (ll k) {
ll x = b/k, c = b%k;
ll ans = (a-k+2)*(a-k+2) +(k-2);
ll tmp = c*(x+1)*(x+1) + (k-c)*x*x;
return ans - tmp;
}
void put() {
cout << ans << endl;
ll x = b/v, c = b%v;
bool flag = false;
for (ll i = 1; i < v; i++) {
if (flag) printf("o");
for (ll j = 0; j < x; j++) printf("x");
if (i <= c) printf("x");
flag = true;
}
for (ll i = 0; i < (a-v+2); i++) printf("o");
for (ll i = 0; i < x; i++) printf("x");
printf("\n");
}
int main () {
ans = -INF;
cin >> a >> b;
if (a == 0) {
cout << b*b*(-1) << endl;
for (ll i = 0; i < b; i++) printf("x");
printf("\n");
return 0;
}
for (ll i = 2; i <= a + 1; i++) {
ll t = solve(i);
if (t > ans) {
ans = t; v = i;
}
}
put();
return 0;
}
题目大意:给出a和b,表示说有a个“o”的卡和b个“x”的卡,将这a+b个卡片排成一个序列,每连续的k个相同的卡片为一个数,表示k^2,如果是o,则是+k^2,否则-k^2。要求找到一个序列使得最后的结果尽量大。
解题思路:一开始一直想用贪心的思想直接构造出来,后来和小伙伴一人想了一种构造方法,但是又互相推翻了。。。。不过很快就想到了暴力,因为b最多1e5,答案肯定要让o尽量在一起,x尽量分开,这样我们每次拿出一个o的卡片就可以让x被多分成一份,所以枚举x被分成的份数,贪心,尽量让o在一起。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll a, b, ans, v = 1;
ll solve (ll k) {
ll x = b/k, c = b%k;
ll ans = (a-k+2)*(a-k+2) +(k-2);
ll tmp = c*(x+1)*(x+1) + (k-c)*x*x;
return ans - tmp;
}
void put() {
cout << ans << endl;
ll x = b/v, c = b%v;
bool flag = false;
for (ll i = 1; i < v; i++) {
if (flag) printf("o");
for (ll j = 0; j < x; j++) printf("x");
if (i <= c) printf("x");
flag = true;
}
for (ll i = 0; i < (a-v+2); i++) printf("o");
for (ll i = 0; i < x; i++) printf("x");
printf("\n");
}
int main () {
ans = -INF;
cin >> a >> b;
if (a == 0) {
cout << b*b*(-1) << endl;
for (ll i = 0; i < b; i++) printf("x");
printf("\n");
return 0;
}
for (ll i = 2; i <= a + 1; i++) {
ll t = solve(i);
if (t > ans) {
ans = t; v = i;
}
}
put();
return 0;
}
相关文章推荐
- CodeForces A. Sereja and Swaps(暴力+贪心啊)
- Codeforcces 617C Watering Flowers【贪心+暴力枚举】
- 【Intel Code Challenge Elimination Round (Div1 + Div2, combined) D】【贪心 暴力 SET】Generating Sets n个不同的x变
- CodeForce 463C Gargari and Bishops(贪心+暴力)
- 【Codeforces Round 272 (Div 2)A】【贪心 暴力 水题】Dreamoon and Stairs n个台阶每次走一步或两步是否有步数恰好为m倍数
- 【Codeforces Round 330 (Div 2)E】【贪心 暴力】Edo and Magnets 给定矩形最多去除m个,最小面积矩形使得覆盖所有小矩形重心
- Codeforces Round #352 (Div. 2) C. Recycling Bottles 暴力+贪心
- Educational Codeforces Round 27 A B 暴力+贪心 C 贪心+排序
- Codefores 460C-Present(二分+贪心)
- Codeforecs 675E Trains and Statistic 贪心+DP
- CodeFores 665D Simple Subset(贪心)
- CodeFores 665D Simple Subset(贪心)
- Codefores Round #419 (Div.2) - C. Karen and Game(暴力模拟)
- CodeForces 398A Cards 贪心 暴力 瞎搞
- Codeforces Round #265 (Div. 2) C 暴力+ 找规律+ 贪心
- 【Codeforces Round 339 (Div 2)D】【暴力 贪心 二分】Skills 最高技能人数乘cm+最低技能乘cf权值最大
- Educational Codeforces Round 21(A.暴力,B.前缀和,C.贪心)
- Codeforecs 493C Vasya and Basketball 贪心+二分
- Codeforces Round #415 (Div. 2)(A,暴力,B,贪心,排序)
- Codeforces Round #324 (Div. 2) (B排列组合)(C贪心)(D哥德巴赫猜想 数论+暴力)