noip2007部分题
1.统计数字
某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数
不超过10000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统
计结果。
第1行是整数n,表示自然数的个数。
第2~n+1 行每行一个自然数。
输出包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大
的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
8
2
4
2
4
5
100
2
100
2 3
4 2
5 1
100 2
【限制】
40%的数据满足:1<=n<=1000
80%的数据满足:1<=n<=50000
100%的数据满足:1<=n<=200000,每个数均不超过1 500 000 000(1.5*10^9)
(来自http://codevs.cn/problem/1164/)
这道题没有什么特别的技术含量,排个序,再统计就行了
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cctype>
#include<map>
#include<set>
using namespace std;
template<typename T>
inline void readInteger(T& u){
char x;
while(!isdigit((x = getchar())));
for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
ungetc(x, stdin);
}
int n;
int* list;
int main(){
freopen("count.in", "r", stdin);
freopen("count.out", "w", stdout);
readInteger(n);
list = new int[(const int)(n + )];
for(int i = ; i < n; i++){
readInteger(list[i]);
}
sort(list, list + n);
int counter = ;
int last = list[];
for(int i = ; i < n; i++){
if(list[i] != last){
cout<<last<<" "<<counter<<endl;
last = list[i];
counter = ;
}else counter++;
}
cout<<last<<" "<<counter<<endl;
return ;
}
统计数字
2.矩阵取数游戏
【问题描述】
帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均
为非负整数。游戏规则如下:
1. 每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素;
2. 每次取走的各个元素只能是该元素所在行的行首或行尾;
3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素值*2i,
其中i 表示第i 次取数(从1 开始编号);
4. 游戏结束总得分为m次取数得分之和。
帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。
第1行为两个用空格隔开的整数n和m。
第2~n+1 行为n*m矩阵,其中每行有m个用单个空格隔开的非负整数。
输出 仅包含1 行,为一个整数,即输入矩阵取数后的最大得分。
2 3
1 2 3
3 4 2
82
样例解释
第 1 次:第1 行取行首元素,第2 行取行尾元素,本次得分为1*21+2*21=6
第2 次:两行均取行首元素,本次得分为2*22+3*22=20
第3 次:得分为3*23+4*23=56。总得分为6+20+56=82
【限制】
60%的数据满足:1<=n, m<=30, 答案不超过1016
100%的数据满足:1<=n, m<=80, 0<=aij<=1000
(来自http://codevs.cn/problem/1166/)
这道题首先一看数据范围就知道要用高精度,最好用上万进制以免其他地方处理不当导致TLE,
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#include<map>
using namespace std;
typedef bool boolean;
template<typename T>
inline void readInteger(T& u){
char x;
while(!isdigit((x = getchar())));
for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
ungetc(x, stdin);
}
typedef class HP{
public:
int w[];
HP(){
memset(w, , sizeof(w));
}
HP(long long x){
memset(w, , sizeof(w));
if(x == ) w[] = ;
while(x > ){
w[++w[]] = x % ;
x /= ;
}
}
HP operator *(int x){
HP result;
result[] = w[] + ;
for(int i = ; i <= w[] + ; i++){
result[i] += w[i] * x;
result[i + ] += result[i] / ;
result[i] %= ;
}
while(result[result[]] == && result[] > ) result[]--;
return result;
}
HP operator +(HP another){
HP result;
result[] = max(w[], another[]) + ;
for(int i = ; i < result[]; i++){
result[i] += w[i] + another[i];
result[i + ] += result[i] / ;
result[i] %= ;
}
while(result[result[]] == && result[] > ) result[]--;
return result;
}
boolean operator <(HP another) const{
if(w[] != another[]) return w[] < another[];
for(int i = w[]; i >= ; i--){
if(w[i] != another[i]) return w[i] < another[i];
}
return false;
}
int& operator [](int pos){
return w[pos];
}
}HP;
int matrix[][];
HP result[];
HP pow_2[];
int n, m;
HP f[][][];
inline void solve(int lines){
memset(f, , sizeof(f));
f[][][] = pow_2[] * matrix[lines][];
f[][][] = pow_2[] * matrix[lines][m];
for(int i = ; i <= m; i++){
for(int j = ; j < i; j++){
HP temp = max(f[i - ][j][], f[i - ][j - ][]);
f[i][j][] = temp + pow_2[i] * matrix[lines][j + ];
f[i][j][] = temp + pow_2[i] * matrix[lines][m - i + j + ];
}
}
for(int i = ; i < m; i++){
for(int j = ; j < ; j++){
result[lines] = max(result[lines], f[m][i][j]);
}
}
}
ostream& operator <<(ostream& out, HP& x){
int buf[];
for(int i = x[]; i >= ; i--){
if(i != x[]){
memset(buf, , sizeof(buf));
int c = x[i];
while(c > ){
buf[++buf[]] = c % ;
c /= ;
}
for(int i = ; i >= ; i--)
putchar(buf[i] + '');
}else{
printf("%d",x[i]);
}
}
return out;
}
inline void init(){
readInteger(n);
readInteger(m);
for(int i = ; i <= n; i++){
for(int j = , x; j <= m; j++){
readInteger(matrix[i][j]);
}
}
pow_2[] = HP();
for(int i = ; i <= m + ; i++)
pow_2[i] = pow_2[i - ] * ;
}
HP ans;
int main(){
freopen("game.in", "r", stdin);
freopen("game.out", "w", stdout);
init();
ans[] = ;
for(int i = ; i <= n; i++){
solve(i);
ans = ans + result[i];
}
cout<<ans;
return ;
}
矩阵取数游戏
思考一下,是不是并没有想出dp之类的十分高效的算法?再看看数据范围,n最大才300,不怕,暴力都很容易过(当然,
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#include<vector>
using namespace std;
typedef bool boolean;
template<typename T>
inline void readInteger(T& u){
char x;
while(!isdigit((x = getchar())));
for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
ungetc(x, stdin);
}
typedef class Edge{
public:
int end;
int next;
int v;
Edge(const int end = , const int next = , const int v = ):end(end),next(next), v(v){}
}Edge;
int ce;
int *h;
Edge* edge;
inline void addEdge(int from, int end, int v){
edge[++ce] = Edge(end, h[from], v);
h[from] = ce;
}
int* buf;
int imn;
int maxdis;
int *rd;
int *brd;
boolean *visable;
void dfs(int* path, int node, int dis, int last, int d){
if(path != NULL){
buf[++buf[]] = node;
if(buf[] != )
brd[buf[] - ] = d;
}
if(dis > maxdis){
maxdis = dis;
if(path != NULL){
memcpy(path, buf, sizeof(int) * (buf[] + ));
memcpy(rd, brd, sizeof(int) * (buf[] + ));
}
imn = node;
}
for(int i = h[node]; i != ; i = edge[i].next){
int e = edge[i].end;
if(e == last) continue;
if(!visable[e]) continue;
dfs(path, e, dis + edge[i].v, node, edge[i].v);
}
if(path != NULL) buf[]--;
}
int n, s;
int *road;
inline void init(){
readInteger(n);
readInteger(s);
edge = new Edge[(const int)(n * )];
h = new int[(const int)(n + )];
buf = new int[(const int)(n + )];
road = new int[(const int)(n + )];
rd = new int[(const int)(n + )];
brd = new int[(const int)(n + )];
memset(h, , sizeof(int) * (n + ));
memset(buf, , sizeof(int) * (n + ));
visable = new boolean[(const int)(n + )];
memset(visable, true, sizeof(boolean) * (n + ));
for(int i = , a, b, v; i < n; i++){
readInteger(a);
readInteger(b);
readInteger(v);
addEdge(a, b, v);
addEdge(b, a, v);
}
}
inline void solve(){
dfs((int*), , , , );
maxdis = ;
dfs(road, imn, , , );
buf[] = ;
maxdis = ;
int len = ;
int l = , r = ;
int cn = ;
int result = 0xfffffff;
visable[road[]] = false;
while(r <= road[] && l <= r){
while(r < road[] && (len + rd[r] <= s)){
len += rd[r];
r++;
cn++;
visable[road[r]] = false;
}
int p = ;
for(int i = l; i <= r; i++){
maxdis = ;
dfs((int*), road[i], , , );
p = max(p, maxdis);
}
if(p < result) result = p;
visable[road[l]] = true;
cn--;
if(cn > )
len -= rd[l];
else if(r < road[]){
len = ;
r++;
visable[road[r]] = false;
}
l++;
}
cout<<result;
}
int main(){
freopen("core.in", "r", stdin);
freopen("core.out", "w", stdout);
init();
solve();
return ;
}
树网的核
noip2007部分题的更多相关文章
- 【NOIP2007提高组】字符串展开
[题外话]这道题纯粹考验耐心,某些经常调程序调到摔键盘的人可以尝试 [题外话2]除了考耐心以外完全没有什么难点 [题外话3]也许会稍微恶心一点? [题外话4]其实我是在别人军训的时候滚来更博客的简直2 ...
- NOIP初赛:完善程序做题技巧
最近写的文章好像还很多的.那么今天我们来讨论NOIP初赛的题型--完善程序.完善程序相对是比较难的题目了.全卷100分,完善程序占了大概26分,占比非常大.如果和英语考试试卷做比较,相当于首字母填空( ...
- NOIP水题合集[3/未完待续]
NOIP2008pj传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球, ...
- vijos1431[noip2007]守望者的逃离(背包动规)
描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者 在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这 个荒岛施咒,这座岛很快就会 ...
- 备战NOIP每周写题记录(一)···不间断更新
※Recorded By ksq2013 //其实这段时间写的题远远大于这篇博文中的内容,只不过那些数以百记的基础题目实在没必要写在blog上; ※week one 2016.7.18 Monday ...
- [BZOJ1999][codevs1167][Noip2007]Core树网的核
[BZOJ1999][codevs1167][Noip2007]Core树网的核 试题描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(t ...
- noip2007提高组题解
题外话:这一年的noip应该是最受大众关心的,以至于在百度上输入noip第三个关键字就是noip2007.主要是由于这篇文章:http://www.zhihu.com/question/2110727 ...
- NOIP前刷题记录
因为本蒻实在太蒻了...对于即将到来的NOIP2018ssfd,所以下决心要把自己近期做过的题目(衡量标准为洛谷蓝题难度或以上)整理一下,归归类,简单地写一下思路,就当作自己复习了吧qwq 本随笔持续 ...
- OI 刷题记录——每周更新
每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...
随机推荐
- Win_Server_2008 安装 Oracle_11g EM时上载EM资料失败
此问题本人也遇到过.在网上找到了解决方案.下部分引用IT PUB. 安装oracle11g 64位.创建数据库到快结束的时候,报告说EM无法创建.emca_2010_06_13_11_05_36.lo ...
- 启动HDFS
$cd /app/hadoop/hadoop-2.2.0/sbin $./start-dfs.sh
- gulp-webserver
gulp-webserver是开启服务器,通常和gulp-livereload结合使用.而这两个结合使用效果,几乎类似browser-Sync.下面是gulp-webserver和gulp-liver ...
- sass和css的calc运算
1.sass不识别不同单位之间的计算,而calc则没问题. width: #{1rem - 2px}; /*出错*/ width: calc(1rem - 2px); 通常情况定制css样式,我不需要 ...
- 如何bitbucket上删除项目
老外网页操作习惯不同,删除项目的按钮,我花了半天,突然瞟到delete,如下图(真他妈的隐蔽,记住这2017/3/7):
- IO流(2)创建文件或文件夹
创建功能: *public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了 *public boolean mkdir():创建文件夹 如果存在这样的文件夹, ...
- Window版本 安装mysql
#1.下载:MySQL Community Server 5.7.16 http://dev.mysql.com/downloads/mysql/ 下载下来解压到指定目录 就安装完成了 #2.解压 如 ...
- linux平台mysql密码设破解
1.先停止mysql服务 service mysqld stop 2.启动mysql服务 并跳过权限认证 mysqld_safe --skip-grant-tables 3.打开另外一个终端 登录my ...
- Python3学习之路~2.1 列表、元组操作
列表 列表是我们以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作. 定义列表(list) names=['Amy','Bob','Cindy','David'] 通过下标访问列 ...
- [py]python多态-动态语言的鸭子类型
弱类型?强类型?动态语言,静态语言 弱类型: 在程序运行过程中,类型可变 还有一种说法: 动态 variables must necessarily be defined before they ar ...