uva 668 - Parliament(贪心)
2014-01-14 11:12
267 查看
题目链接:uva 668 - Parliament
题目大意:给出一个n,问最多用几个不同的数组成n,如果有个数相同的,输出从小到大排序的字典序最大的。
解题思路:首先找到一个序列,由2+3+...+x是恰好小于n的,然后将n - sum(x)平局分给这若干个数。
#include <stdio.h>
const int N = 1005;
int sum(int x) {
return (1 + x) * x / 2 - 1;
}
int main() {
int cas, n;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &n);
int num
;
for (int i = 2; i <= n; i++) if (sum(i+1) > n) {
int s = (n - sum(i)) / (i - 1);
int t = (n - sum(i)) % (i - 1);
for (int j = 2; j <= i - t; j++) num[j] = j + s;
for (int j = i - t + 1; j <= i; j++) num[j] = j + s + 1;
printf("%d", num[2]);
for (int j = 3; j <= i; j++) printf(" %d", num[j]);
printf("\n");
break;
}
if (cas) printf("\n");
}
return 0;
}
题目大意:给出一个n,问最多用几个不同的数组成n,如果有个数相同的,输出从小到大排序的字典序最大的。
解题思路:首先找到一个序列,由2+3+...+x是恰好小于n的,然后将n - sum(x)平局分给这若干个数。
#include <stdio.h>
const int N = 1005;
int sum(int x) {
return (1 + x) * x / 2 - 1;
}
int main() {
int cas, n;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &n);
int num
;
for (int i = 2; i <= n; i++) if (sum(i+1) > n) {
int s = (n - sum(i)) / (i - 1);
int t = (n - sum(i)) % (i - 1);
for (int j = 2; j <= i - t; j++) num[j] = j + s;
for (int j = i - t + 1; j <= i; j++) num[j] = j + s + 1;
printf("%d", num[2]);
for (int j = 3; j <= i; j++) printf(" %d", num[j]);
printf("\n");
break;
}
if (cas) printf("\n");
}
return 0;
}
相关文章推荐
- 淡入淡出UIView动画
- linux新增用户和密码
- XMPP学习——3、XMPP协议学习补充
- Linux du
- php获取本周周一、周日时间,上周周一、周日时间,本月第一天,本月最后一天,上个月第一天,最后一天时间
- 在Linux上安装Memcached服务
- linxu安装SNMP
- android Activtity 之间传递对象的方法 application
- 如何使用java指令执行含package的class文件
- 浏览器缓存机制
- linxu安装SNMP
- linux 下大量TIME_WAIT 的处理
- javascript表头固定-2
- 从前后台编程向操作系统编程思维转变
- 空白块多出几像素(IE6)
- 云桌面问题
- UVa 621 Secret Research
- 云计算服务 PaaS采用会在2014年持续攀升
- Main函数参数argc,argv如何传入
- SUSE:开放是云计算的未来