Tsinghua dsa mooc pa1
第一题Range
关键:二分查找,查找不大于一个数的最大下标。
#include <cstdlib>
#include <cstdio>
4 int compare (const void * a, const void * b){
return ( *(int*)a - *(int*)b );
}
int bisearch(int *array,int low, int high,int aim){
int mid;
while(low<=high){
mid = (low+high)>>;
if(aim<array[mid])
high=mid-;
else if(aim>array[mid])
low=mid+;
else
return mid;
}
// printf("%d\n",high);
return high;
}
int main(int argc, char* argv[]){
// freopen("in.txt", "r", stdin);
int pnum,qtime;
scanf("%d %d",&pnum,&qtime);
int *points = new int[pnum];
for(int i=; i<pnum; i++)
scanf("%d",&points[i]);
qsort(points,pnum,sizeof(int),compare);
int lower,higher;//range
int left,right;
for(int i=; i<qtime; i++){
scanf("%d %d",&lower,&higher);
left=bisearch(points,,pnum-,lower);
right=bisearch(points,,pnum-,higher);
if(right<){//notice
printf("0\n");
continue;
}
if(left<){//notice
printf("%d\n",right+);
continue;
}
if(points[left]==lower){
printf("%d\n",right-left+);
}else
printf("%d\n",right-left);
}
delete [] points;
return ;
}
当使用cin/cout时候,Exceed Time Limit;此外,我还比较了使用静态分配数组和动态堆分配数组的运行时间差异,发现几乎相同。
第二题祖玛,自己尝试写了一个简单的双向链表,能进行插入和删除。20个案例,最后一个超时。此外,这个题也是C/C++混杂起来使用,好尴尬。
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
class Node{
public:
Node* prev;
Node* next;
char content;
Node():prev(NULL),next(NULL),content(){}
Node(char c):prev(NULL),next(NULL),content(c){}
};
class Dolist{
public:
Node head;
int len;
Dolist(string in);
~Dolist();
Node* insert(int pos, char ch);
void del(Node *inpos);
void print();
};
Dolist::~Dolist(){
Node *fir=head.next;
while(fir){
Node *next=fir->next;
delete fir;
fir=next;
}
}
Node* Dolist::insert(int pos, char ch){
Node *tmp = new Node(ch);
Node* cur=&head;
//pos<=len
if(pos==len){//insert in the end
while(cur->next){
cur=cur->next;
}
cur->next=tmp;
tmp->prev=cur;
}else{
for(int i=;i<pos;i++){
cur=cur->next;
}
Node* nex=cur->next;
cur->next=tmp;
tmp->prev=cur;
tmp->next=nex;
nex->prev=tmp;
}
len++;
return tmp;
}
void Dolist::del(Node *inpos){
if(inpos==&head)
return;
int dellen=;//num of same nodes
Node *fir=inpos,*las=inpos;//pointers between same nodes,from beginning to end
while(fir->content==fir->prev->content){//search left
dellen++;
fir=fir->prev;
}
while(las->next){//search right
if(las->content==las->next->content){
dellen++;
las=las->next;
}else
break;
}
if(dellen>=){//if num is above to 3,delete
Node *tmp=fir->prev;
fir->prev->next=las->next;
if(las->next)
las->next->prev=fir->prev;
Node *tmp1=fir->next;
while(tmp1!=las){
delete fir;
fir=tmp1;
tmp1=fir->next;
}
delete fir;
delete las;
len -= dellen;
del(tmp);//iteration }
}
void Dolist::print(){
if(head.next==NULL)
printf("-\n");
else{
Node *tmp=head.next;
while(tmp){
putchar(tmp->content);
tmp=tmp->next;
}
printf("\n");
}
}
Dolist::Dolist(string in){
len=;
int siz=in.size();
for(int i=; i<siz; i++){
insert(i,in[i]);
}
}
int main(int argc, char* argv[]){
//freopen("in.txt","r",stdin);
string init;
getline(cin,init);
Dolist zuma(init);//initial
int time;
scanf("%d",&time);
int pos;
char ch;
while(time--){
scanf("%d %c",&pos,&ch);
Node *inpos = zuma.insert(pos,ch);
zuma.del(inpos);
zuma.print();
}
return ;
}
第三题灯塔,先对x坐标使用快速排序,排序后对y坐标进行归并排序,在归并排序的同时求出顺序对的数目。20个案例通过19个,最后一个超时。
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef struct tower{
int x;
int y;
}Tower;
int compare(const void *a,const void *b){
return ((*(Tower*)a).x - (*(Tower*)b).x);
}
long long Merge(int *array, int m, int mid, int n){
long long tmp=;
int *copy=new int[n-m+];
int i,j,k=;
for(i=m,j=mid+;i<=mid&&j<=n;){
if(array[i]<array[j]){
copy[k]=array[i];
tmp += (n-j+);//这是最关键的,在进行merge时,如果array[i]<array[j],那么从j到n的数都大于array[i]
i++;
}else{
copy[k]=array[j];
j++;
}
k++;
}
if(i<=mid){
for(int ii=i; ii<=mid; ii++){
copy[k]=array[ii];
k++;
}
}else if(j<=n){
for(int ii=j; ii<=n; ii++){
copy[k]=array[ii];
k++;
}
}
memcpy(array+m,copy,(n-m+)*sizeof(int));
delete [] copy;
return tmp;
}
long long MergeSort(int *array, int m, int n){
if(m==n) return ;
int mid = m+((n-m)>>);
long long num1 = MergeSort(array,m,mid);
long long num2 = MergeSort(array,mid+,n);
long long num3 = Merge(array,m,mid,n);
return num1+num2+num3;
} int main(int argc,char *argv[]){
//freopen("in.txt","r",stdin);
int num;
scanf("%d",&num);
Tower *all = new Tower[num];
for(int i=; i<num; i++){
scanf("%d %d",&(all[i].x),&(all[i].y));
}
qsort(all,num,sizeof(Tower),compare);
int *ally = new int[num];//取出所有的y,通过归并排序求出顺序对
for(int i=; i<num; i++)
ally[i]=all[i].y;
long long out = MergeSort(ally,,num-);
printf("%lld\n",out);
delete [] all;
delete [] ally;
return ;
}
Tsinghua dsa mooc pa1的更多相关文章
- 《Tsinghua oc mooc》第8~10讲 虚拟内存管理
资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 第八讲 虚拟内存概念 为什 ...
- 《Tsinghua oc mooc》第5~7讲 物理内存管理
资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 段式内存管理中,逻辑 ...
- 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用
资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 为什么用户态和内核态 ...
- 【DSA MOOC】有序向量二分查找的三个 版本
内容来自 TsinghuaX: 30240184X 数据结构(2015秋) 课程的Vector一章,对有序向量的二分查找有三个版本 三个版本的函数原型是一致的,都是 Rank search(T con ...
- 【DSA MOOC】起泡排序的原理及常数优化
根据学堂在线TsinghuaX: 30240184X 数据结构(2015秋)这门课的内容,对bubblesort做了一些总结. 1. bubblesort(起泡排序),原理来自这样一个观察规律:若序列 ...
- Tsinghua dsa pa2
第一题,列车调度(train) 在这个题目中,模拟压栈出栈,同时判断调度方案是否可行. #include <cstdio> #include <cstring> #define ...
- 《Tsinghua os mooc》第21~22讲 文件系统
第二十一讲 文件系统 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能. 组织.检索.读写访问数据 大多数计算机系统都有文件系统 Google 也是一个文件系统 文件是具有符号名,由 ...
- 《Tsinghua os mooc》第17~20讲 同步互斥、信号量、管程、死锁
第十七讲 同步互斥 进程并发执行 好处1:共享资源.比如:多个用户使用同一台计算机. 好处2:加速.I/O操作和CPU计算可以重叠(并行). 好处3:模块化. 将大程序分解成小程序.以编译为例,gcc ...
- 《Tsinghua os mooc》第15~16讲 处理机调度
第十五讲 处理机调度 进程调度时机 非抢占系统中,当前进程主动放弃CPU时发生调度,分为两种情况: 进程从运行状态切换到等待状态 进程被终结了 可抢占系统中,中断请求被服务例程响应完成时发生调度,也分 ...
随机推荐
- Python关于eval与json在字典转换方面的性能比较
背景介绍 因为python中有eval()方法,可以很方便的将一些字符串类型与字典等数据结构之间进行转换, 所以公司的数据处理同事在保存一些特殊数据时就直接将字典的字符串保存在数据库中. 在程序中读取 ...
- tomcat web项目部署方式
1.利用MyEclipse的部署部工具部署项目,可以直接部署成文件形式,这样当启动tomcat后可以直接访问 2.利用MyEclipse部署工具部署war形式,点击发布选择tomcat时可以选择该项 ...
- 449A - Jzzhu and Chocolate 贪心
一道贪心题,尽量横着切或竖着切,实在不行在交叉切 #include<iostream> #include<stdio.h> using namespace std; int m ...
- python 笔记4-- 函数式编程
高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式. 在python中 函数也是一种变量 def add(x, y, f): return f(x) + f( ...
- 淘宝开源任务调度框架tbschedule
背景 分布式任务调度是非常常见的一种应用场景,一般对可用性和性能要求不高的任务,采用单点即可,例如linux的crontab,spring的quarz,但是如果要求部署多个节点,达到高可用的效果,上面 ...
- java基础之 第一步 :jdk安装配置
Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.ora ...
- HDU 5768 - Lucky7
题意: 给出x, y, m[1...n], a[1..n]. 在[x,y]中寻找 p % 7 = 0 且对任意(1<= i <=n) p % m[i] != a[i] 的数字的个数 ...
- codeforces #332 div2
A. #include<cstdio> #include<algorithm> #include<cmath> #include<map> #inclu ...
- AngularJS 深入理解 $scope 转载▼
AngularJS 深入理解 $scope 转载▼ (2015-04-07 14:09:50) $scope 的使用贯穿整个 AngularJS App 应用,它与数据模型相关联,同时也是表达 ...
- Linux下vim文件未正常退出,修复文件
Linux下vim文件未正常退出,会产生一个 .文件名.swp的文件 ls -al ,rm 删掉.swp文件 之后就可以正常使用文件了