2019.9.23 星期一
又到了一天最高兴的日记时刻,这意味着今天的事情已经办完了。
今天秋分了,虽然这里不是中国,但也感觉到了初秋的凉爽,美好的早晨是从一个阴天开始的。今天还算高产。这几天连续吃多了,觉得自己挺难受的,决定这周控一天饮食,然后把正常的作息调回来。果然一人肚子饿脑子就清醒,今天开了挂一样地连AC了4道,其实是挺简单的贪心题,但是还需要动动脑子的,有些贪心题不会光用贪心算法,还要有动态规划的思想,作为练习再合适不过了。然后上课到下午,今天没吃饭的缘故,在看ccpc2019网络邀请赛被吐槽最多的钓鱼问题的时候,脑子突然一下子歇菜了,我才想起来之前在家每天早上9点起来,半天不吃饭没问题啊,下午去高中补习班的自习室学习四个小时就能回家了,但是在这里不行,不吃饭后半天脑子真的是转不动。大概只想到了用优先队列取池塘,然后一个一个看剩余时间再来波最短路,其余的,随他去吧,明天再说,今儿脑子转不动了。转不动也不能让自己闲着,自己动手重构了下线段树,有点进展,就是自己发现了原来不是我更新方法写错了,是剪枝出了问题,加上剪枝就WA,不加就TLE,说明这个地方是关键,mark√,明天排故障。
从我的语气也看出来了吧我现在真的是精疲力竭了,就等着旅行呢。都觉得我这个人没什么爱好,我其实特别喜欢旅游(奈何口袋穷),去用双脚探索城市里的每一个角落,不管是在北京城乡结合部的历险,还是从洛杉矶市中心走到麦克阿瑟公园,都是一段难忘的回忆,只不过好像自己从高中以来的大多数出门都是带着任务的,不是出去打比赛,就是去参加学习或者哪一个会的路上然后一个人过着小资生活,有时间就应该多出去看看,走走,趁着还是学生,不要等着等着就长大没机会了。
我感觉我还能学吧,再加把劲,把regional打了,我还行,来,上代码,关机,回去休息。
题目1 : POJ1323 Game Prediction (传送门)
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <math.h>
#include <cstdio>
using namespace std;
#define limit 20000 + 5
#define INF 0x3f3f3f3f
#define lch root * 2 + 1
#define rch root * 2 + 2
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define ff(a) printf("%d\n",a );
typedef long long ll;
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快读
vector<int>v,t;//所有的数组分为两个的集合
int n,m;
int dp[limit];
int vis[limit];
int main(){
int cnt = 0;
while(scanf("%d%d" , &n, &m) == 2 ){
if(!n && !m)break;
v.clear();
t.clear();
memset(vis , 0 , sizeof(vis));//初始化为0
for(int i = 0 ; i < m ; ++i){
int a;
scanf("%d" , &a);
v.push_back(a);//推入
vis[a] = 1;
}
int ans = 0;
sort(v.rbegin(),v.rend());//大小排序,从大到小
for(int i = m * n ; i >= 1; --i){
if(!vis[i])t.push_back(i);//推入进去,这样就分为两个集合了,而且是降序
}
int pb = 0;
for(int i = 0 ; i < v.size() ; ++i){
if(v[i] > t[pb]){
ans++;//输了就打掉
}else{
pb++;
}
}
printf("Case %d: %d\n",++cnt,ans );
}
return 0;
}
题目2: HDU1789 Doing Homework Again(传送门)
#include <bits/stdc++.h>
using namespace std;
#define limit 20000 + 5
#define INF 0x3f3f3f3f
#define lch root * 2 + 1
#define rch root * 2 + 2
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define ff(a) printf("%d\n",a );
typedef long long ll;
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快读
struct homework{
int due, score;//确定两个参数
homework() = default;
homework(int dd, int ss):due(dd), score(ss){}
bool operator<(const homework &rhs)const{
if(score == rhs.score){
return due < rhs.due;
}else{
return score > rhs.score;
}
}
};
vector<homework>v;
int kase, n ,a[limit],b[limit],vis[limit];
int main(){
scanf("%d", &kase);
while(kase--){
scanf("%d",&n);
memset(vis, 0 , sizeof(vis));//初始化为0
for(int i = 1 ; i <= n ; ++i){
scanf("%d", &a[i]);
}
for(int i = 1 ; i <= n ; ++i){
scanf("%d", &b[i]);
}
for(int i = 1 ; i <= n ; ++i){
v.push_back(homework(a[i],b[i]));
}
sort(v.begin(), v.end());//排排站
int ans = 0;
int day = 1;//计时器
for(int i = 0 ; i < v.size() ; ++i,day++){
int ddl = v[i].due, score = v[i].score;
int flag = 1;
for(int j = ddl; j > 0 ; --j){
if(!vis[j]){//这一天没事儿干
flag = 0;
vis[j] = 1;
break;
}//其他情况是都有事情干
}
if(flag){
ans += score;
}
}//yes
ff(ans);
v.clear();
}
return 0;
}
题目3:HDU2037 今年暑假不AC(添加链接描述)
#include <bits/stdc++.h>
using namespace std;
#define limit 20000 + 5
#define INF 0x3f3f3f3f
#define lch root * 2 + 1
#define rch root * 2 + 2
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define ff(a) printf("%d\n",a );
typedef long long ll;
void read(int &x){
char ch = getchar();x = 0;
for (; ch < '0' || ch > '9'; ch = getchar());
for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快读
struct prog{
int L, R;
prog() = default;
prog(int ll , int rr):L(ll), R(rr){}
bool operator<(const prog & rhs)const{
return R < rhs.R;
}
};
vector<prog>v;
int n;
int main(){
while(scanf("%d" , &n) != EOF && n){
v.clear();
for(int i = 0 ; i < n ; ++i){
int beg ,ed;
scanf("%d%d" , &beg, &ed);
v.push_back(prog(beg,ed));
}//制作完成
int ans = 0;
int last = -1;//上次的截止时间
sort(v.begin() ,v.end());//排好序
for(int i = 0 ; i < v.size() ; ++i){
int timeStart = v[i].L;
if(timeStart >= last){
++ans;
//printf("The time begin is at %d , time ends at %d\n", v[i].L, v[i].R);
last = v[i].R;
}
}
ff(ans);
}
return 0;
}