!codeforces 399C Cards-数论&贪心-(暴搜)

题意:有两种字符x和o,计算相同的连续字符的个数的平方,然后用o的平方和减去x的平方和,求最大的结果,并输出相应的序列。

分析:

数论知识是:要使o1^2+o2^2+.....尽可能的大,就要让o尽量凑到一起使它尽量长;要使x1^2+x2^2+.....尽可能的小,就要尽量分散他们,因此每次分的时候采用均分的方式

用上面的理论为基础,然后枚举把o和x分的块数,不断更新结果。每一块的长度用上面的理论加上块数是可以求出来的。

错误原因:

1.TLE:循环变量的数据类型错了。因为这里a和b是long long ,所以循环变量也要设成long long

2.WA:还是long long的问题,之前改了但是不仔细,输入和一个输出用的%d

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
//#define min(a,b) a<b?a:b //经测试直接用define也行,并不是错误原因
#define INF 1000000007
using namespace std;
long long a,b;
long long mi;
long long min(long long a,long long b)
{
	return a<b?a:b;
}
int main()
{
	while(cin>>a>>b){
		if(a==0){
			cout<<"-"<<b*b<<endl;
			for(int i=0;i<b;i++) cout<<"x";
			cout<<endl;
		}
		else if(b<=1){
			cout<<a*a-b*b<<endl;
			for(int i=0;i<a;i++) cout<<"o";
			for(int i=0;i<b;i++) cout<<"x";
			cout<<endl;
		}
		else{
			long long ans=-(a+b)*(a+b);
			long long o,x;
			mi=min(a,b);
			for(long long i=1;i<=mi;i++){
				long long a1=(i-1)+(a-(i-1))*(a-(i-1));
				for(long long j=i-1;j<=i+1;j++){
					if(j>0&&j<=b){
						long long b1=(b/j)*(b/j)*(j-b%j)+(b/j+1)*(b/j+1)*(b%j);
						long long s=a1-b1;
						if(ans<s){
							ans=s;
							o=i,x=j;
						}
					}
				}
			}
			cout<<ans<<endl;
			if(o>=x){
				for(long long i=1;i<=o;i++){
					long long len1,len2;
					if(i==1) len1=a-(o-1);
					else len1=1;
					if(i<=b%x) len2=b/x+1;
					else len2=b/x;
					for(long long j=0;j<len1;j++) cout<<"o";
					if(i<=x) for(long long j=0;j<len2;j++) cout<<"x";
				}
		        cout<<endl;
			}
			else{
				for(long long i=1;i<=x;i++){
					long long len1,len2;
					if(i<=b%x) len2=b/x+1;
					else len2=b/x;
					if(i==1) len1=a-(o-1);
					else len1=1;
					for(long long j=0;j<len2;j++) cout<<"x";
					if(i<=o) for(long long j=0;j<len1;j++) cout<<"o";
				}
				cout<<endl;
			}
		}
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 05:29:11

!codeforces 399C Cards-数论&贪心-(暴搜)的相关文章

codeforces 339C Xenia and Weights(dp或暴搜)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Xenia and Weights Xenia has a set of weights and pan scales. Each weight has an integer weight from 1 to 10 kilos. Xenia is going to play with scales and weights a little. For this, she puts

Codeforces 223APartial Sums 数论+组合数学

题意很简单,求不是那么好求的,k很大 要操作很多次,所以不可能直接来的,印象中解决操作比较多无非线段树 循环节 矩阵 组合数等等吧,这道题目 也就只能多画画什么 的了 就以第一个案例为主吧 , 3 1 2 3 k我们依据画的次数来自己定好了 下面的每个数表示这个位置的 数由最初的 数组num[]中多少个数加起来得到的 当k为0的时候呢,就是 1 1 1 k为1的时候呢 1 2 3 k为2的时候呢 1 3 6 那么k为3的时候 1 4 10 这里看一下 从数组下标0开始,那么其实就是 C(i +

子矩阵(暴搜(全排列)+DP)

子矩阵(暴搜(全排列)+DP) 一.题目 子矩阵 时间限制: 1 Sec  内存限制: 128 MB 提交: 1  解决: 1 [提交][状态][讨论版] 题目描述 给出如下定义: 1. 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素得到一个2*3的子矩阵如右图所示. 9 3 3 3 9 9 4 8 7 4 1 7 4 6 6 6 8 5 6 9 7 4 5 6 1 的

【BZOJ-3033】太鼓达人 欧拉图 + 暴搜

3033: 太鼓达人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 204  Solved: 154[Submit][Status][Discuss] Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和lydrainbowcat拯救出来的的applepi.看到两人对太鼓达人产生了兴趣,applepi果断闪

c++20701除法(刘汝佳1、2册第七章,暴搜解决)

20701除法 难度级别: B: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述     输入正整数n,按从小到大的顺序输出所有满足表达式abcde/fghij=n的abcde和fghij,其中a~j恰好为数字0~9的一个排列. 如果没有符合题意的数,输出0.本题所说的五位数可以包括前导0的,如01234在这里也称为五位数. 输入 一个正整数n  输出 若干行,每行包括两个符合要求的五位正整数(每行的两个数先大后小),两数之

[HDU 5135] Little Zu Chongzhi&#39;s Triangles (dfs暴搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5135 题目大意:给你n条边,选出若干条边,组成若干个三角形,使得面积和最大.输出最大的面积和. 先将边从小到大排序,这样前面的两条边加起来如果不大于第三条边就可以跳出,这是一个存在性条件. dfs(int idx,int now,int cnt,int nowmax)代表我当前处理的是第idx条边,已经加入边集的有cnt条边,当前的边的长度和为now,组成的最大面积和为nowmax. 暴力枚举每个三

HDU 5012 bfs暴搜

Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 243    Accepted Submission(s): 135 Problem Description There are 2 special dices on the table. On each face of the dice, a distinct number wa

HDU 4284 Travel Folyd预处理+dfs暴搜

题意:给你一些N个点,M条边,走每条边要花费金钱,然后给出其中必须访问的点,在这些点可以打工,但是需要先拿到证书,只可以打一次,也可以选择不打工之直接经过它.一个人从1号点出发,给出初始金钱,问你能不能访问所以的点,并且获得所以证书. 题解:目标是那些一定要访问的点,怎么到达的我们不关心,但是我们关系花费最少的路径,而且到达那个点后是一定要打工的,如果只是经过,那么在求花费最少的路径的时候已经考虑过了. 因此先用Folyd求出各个点直接的最短路径,由于N很小,又只要求出一个解,所以直接dfs暴搜

bzoj 2241: [SDOI2011]打地鼠(暴搜+减枝)

2241: [SDOI2011]打地鼠 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1098  Solved: 691 [Submit][Status][Discuss] Description 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. 游戏中的锤子每次只能打一只地鼠,如果多只地鼠同时探出头,玩家只能通过多次挥舞锤子的方