先就写这几道水题,马上南京网络赛了,去HDU看看(哎...挖坑不填)
A-妹妹的工资怎么算(简单二分)
题目链接:http://47.93.252.151/problem.php?id=1148
题目描述
《我的妹妹哪有这么可爱!》中的女主叫做高坂桐乃,高坂家的幺女,外表出众、成绩优秀、运动万能的少女,而且还兼职流行杂志的专属模特。阳光的外表下却有着特别的兴趣,是个在意周围眼光的御宅族,喜欢妹系的成人游戏和动梅露露的动画。桐乃有很多的工作,这次她有接到一个模特工作,这次一共工作n天,每天的工资为vi 有m个结算工资的日子,因为桐乃还是初中生所以她可以任意挑选m天来拿工资,但是桐乃每次不想拿太多的钱,所以她想计划使她一次性拿的钱中的最大的最小,(最后一天一定要拿工资)但是她不会分配日子,按照惯例,她找来了哥哥京介进行“人生咨询”,想让哥哥帮忙解决这个问题,哥哥也不怎么会,但是哥哥怎么会拒接妹妹的请求呢,所以他来拜托你解决这个问题。
输入
第一行 两个数 n ,m(m<=n<=100000)
第二行 n个数,vi (vi<100000)
输出
一个数表示答案
样例输入
5 3
1 2 3 4 5
样例输出
6
提示
解释:1 2 3// 4// 5 // //为拿工资
之前遇到过一道类似的,把之前的代码一贴也能过...月度开销
这数据。。感觉水的很...
但是还是手写了一个,毕竟要做题
ac:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
//#define mod 1e9+7
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
const int MAXN=1e5+5;
ll arr[MAXN];
int n,m;
bool judge(ll mid)
{
ll res=0,num=1;
for(int i=1;i<=n;++i)
{
res+=arr[i];
if(res>mid)
{
num++;
res=arr[i];
}
//cout<<num<<endl;
if(num>m)//分到一半,不能领了,需要一天领更多
return 1;
}
return 0;//能领完,但是或许可以一天领更少
}
int main()//http://47.93.252.151/problem.php?id=1151
{
std::ios::sync_with_stdio(false);
cin>>n>>m;
ll l=0,r=0,mid;
for(int i=1;i<=n;++i)
{
cin>>arr[i];
r=r+arr[i];
l=max(arr[i],l);
}
while(r>l)
{
mid=(l+r)>>1;
//cout<<l<<" "<<r<<" "<<mid<<endl;
if(judge(mid))//分的太细了,应该更多一点
l=mid+1;
else//分的太多了,还能再少点
r=mid;
}
cout<<r<<endl;
}
C-找面码
题目链接:http://47.93.252.151/problem.php?id=1150
题目描述
超和平Busters里的面码在这个城市里迷路了,仁太特别着急,面码很害怕一个人,所以仁太想快一点到达面码的身边,现在仁太手上只有一张地图,地图上标明了m条街道,连接着n个区 每条路都会有一个交通压力,现在仁太在s点,他知道面码在t点,请你帮仁太规划一条交通压力最小的路线使他快一点到达面码的身边并且使得经过道路的拥挤度最大值最小
输入
第一行四个数字n,m,s,t。
接下来m 行 每行三个数字表示两个区和这条路的交通压力 两个区可能有多条路相连
n<=10000,m<=2n,拥挤度<=10000
输出
输出题目要求的拥挤度
说明: 题目保证可以从s出发到达t 且 1<=s.t<=n
样例输入
3 3 1 3
1 2 2
2 3 1
1 3 4
样例输出
2
题很简单,就是数据范围有点大,然后用堆优化一下就行了,反正测试数据那么水,随随便便就过了(我猜就一组测试样例(恶意揣度2333))
最短路,随便什么算法都行了,我用的是n*logn的
ac:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
//#define mod 1e9+7
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
const int MAXN=1e5+5;
struct dot{
int v,l,maxl;
dot(int _v=0,int _l=0,int _maxl=0):
v(_v),l(_l),maxl(_maxl){};
};
struct cmp{
bool operator()(const dot &a,const dot &b){
if(a.l==b.l)
return a.maxl>b.maxl;
return a.l>b.l;
}
};
struct node{
int v,w,nxt;
node(int _v=0,int _w=0,int _nxt=0):
v(_v),w(_w),nxt(_nxt){};
}edge[10100<<2];
int head[10100<<2],e;
int dis[10100];
bool vis[10100];
int n,m,s,t;
void add(int u,int v,int w)
{
edge[e]=node(v,w,head[u]);
head[u]=e++;
}
void intt()
{
clean(head,-1);
e=0;
}
int prim()
{
clean(dis,INF);
clean(vis,0);
dis[s]=0;
priority_queue<dot,vector<dot>,cmp> que;
que.push(dot(s,0,0));
while(que.size())
{
dot u=que.top();
que.pop();
if(u.v==t)
return u.maxl;
vis[u.v]=1;
for(int i=head[u.v];i+1;i=edge[i].nxt)
{
int temp=edge[i].v;
if(dis[temp]>dis[u.v]+edge[i].w&&vis[temp]==0)
{
dis[temp]=dis[u.v]+edge[i].w;
int maxl=max(u.maxl,edge[i].w);
que.push(dot(temp,dis[temp],maxl));
}
}
}
return -1;
}
int main()
{
std::ios::sync_with_stdio(false);
intt();
cin>>n>>m>>s>>t;
int a,b,l;
for(int i=0;i<m;++i)
{
cin>>a>>b>>l;
add(a,b,l);
add(b,a,l);
}
int f=prim();
cout<<f<<endl;
}
D-轻羽飞扬(简单DP)
题目链接:http://47.93.252.151/problem.php?id=1151
题目描述
电视动画《轻羽飞扬》改编自滨田浩辅原作的同名漫画,作为今年的7月新番,dyl非常喜欢尤其是里面的大魔王&&主角 羽咲绫乃,我们知道绫乃小的时候特别喜欢打羽毛球,她的母亲千夏是一个非常有名的羽毛球选手曾获得女子单人羽毛球全日本综合优胜十连霸冠军,对待自己的女儿千夏有独特的训练方式,绫乃很喜欢和母亲打羽毛球,但是呢千夏每天只和绫乃打一局,一旦绫乃接不住母亲的球,千夏就让绫乃自己训练,作为绫乃的好朋友藤泽英玲奈你将如何帮助绫乃能够更多的接到母亲的羽毛球呢?
首先 我们将羽毛球场分成0-10 11个位置如图所示
最开始 绫乃站在5的位置,每一秒钟都会有若干个球落在若干个位置,由于绫乃刚刚进行过训练所以很累,她只能接到所处位置或者相邻位置上的球,所以绫乃最多能够接到几个球呢?
输入
输入有多组 不超过10组数据 以0结尾
每组 第一行一个数 n 表示球的数量 (n<100000)
第二行到n+1行每行两个数x,t (x代表球落下的位置,t代表第几秒) (t<100000)
输出
一个数代表 绫乃最多能够接到的球的数量
//
开始时站在5这个位置,因此在第一秒,ta只能接到4,5,6这三个位置中其中一个位置上的羽毛球。问最多可能接到多少个球?
样例输入
6
5 1
4 1
6 1
7 2
7 2
8 3
0
样例输出
4
提示
这个题多组输入 输入时请用while(cin>>n&&n) 以0结尾
接球时要么接自己原来位置上的球或者是移动到相邻的位置接相邻位置的球
/*---------------------------------------------------------------------------------------------------------------------------*/
简单DP....但是一开始写的时候把坐标写到外面的循环了..导致一直WA..外循环应该是时间....一层一层的刷新DP数组....太谜了..
ac:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
//#define mod 1e9+7
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
const int MAXN=1e+5;
int mp[MAXN][15];
int dp[MAXN][15];
int n;
int get_max(int a,int b,int c)
{
if(a<b)
return b>c?b:c;
else
return a>c?a:c;
}
int main()//http://47.93.252.151/problem.php?id=1151
{
std::ios::sync_with_stdio(false);
while(cin>>n&&n)
{
clean(dp,0);
clean(mp,0);
int x,t,m=0;
for(int i=1;i<=n;++i)
{
cin>>x>>t;
m=max(m,t);
if((x<5-t)||(x>5+t))
continue;
else
mp[t][x]++;
}
for(int i=1;i<=m;++i)
{
for(int j=0;j<11;++j)//遍历11个点
{
if(j>0)//不是第一个点
dp[i][j]=get_max(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])+mp[i][j];//前中后
else//第一个点
dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+mp[i][j];
}
}
// for(int i=0;i<=m;++i)
// {
// for(int j=0;j<11;++j)
// cout<<dp[i][j]<<" ";
// cout<<endl;
// }
int ans=-1;
for(int i=0;i<11;++i)
ans=max(ans,dp[m][i]);
cout<<ans<<endl;
}
}
E:NO GAME NO LIFE(思维+优先队列)
题目描述
输了不感到悔恨的人,没资格当游戏玩家,不过正因为如此,才会第一次觉得快乐
在网络上成为都市传说的天才玩家兄妹·空和白实际是家里蹲尼特族。他们将将世界称为“垃圾游戏”。某天,这两个人某一天被自称“神”的少年召唤到了异世界。那是被神明禁止了战争,一切交由游戏来决定"的世界——没错,就连国境线也是一样。被其他种族逼入绝境,只剩下最后一座都市的“人类种”。空和白,两名废人兄妹到底能否在异世界成为“人类的救世主”?——那么,让我们开始游戏吧,
空白两人遇到了这样一个游戏,一款类似2048的游戏规则如下
一开始,有 n 个方块,每个方块上有一个 1 到 m 的整数。空白可以进行两种操作:
1、 选择两个数字相同的方块(不一定要相邻),将它们合并成一个数字为原来的两倍的方块;
2、 减小一个方块上的数字。
操作的次数没有限制,最终的得分为所有方块上的最大的数字。因为空白玩游戏没有输过,所以请你想办法来解决掉这个问题!
输入
第一行 两个数n代表n个方块 m代表方块上的数字 m n<=1e5
第二行 n个数
输出
一个数表示最大值
样例输入
5 10
6 10 7 5 4
样例输出
24
提示
答案可能会爆int
注意回报int就行了,这个题也很好想解法,哎....水题
ac:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
//#define mod 1e9+7
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
struct cmp{
bool operator()(const ll &a,const ll &b){
return a>b;
}
};
int main()
{
priority_queue<ll,vector<ll>,cmp> que;
while(que.size())
que.pop();
int n,m;
cin>>n>>m;
ll x;
for(int i=1;i<=n;++i)
{
cin>>x;
que.push(x);
}
while(que.size()>1)
{
ll e1=que.top();que.pop();
if(que.top()>2*e1)//第二个更大
continue;
else
{
que.pop();
que.push(e1*2);
}
}
cout<<que.top()<<endl;
return 0;
}
G:找食物(简单搜索)
题目链接:http://47.93.252.151/problem.php?id=1154
题目描述
很多关于末日的故事都很残酷,但这部《少女终末旅行》却不一样。没有战争,没有为了食物的争斗,没有人在乎之前发生了什么,未来会怎么样,人类在一片温暖中缓慢的等待死亡。距离极尽繁荣与荣华的人类文明迎来末日,已经经过了漫长的岁月。人类几乎死绝,就连生物都消失的迎来末日的世界。复杂建造的都市化作宛如迷宫的废墟,无从整备的机械也渐渐停止了动作。是何时结束的呢,是从何时开始结束的呢,就连这种想法也不复存在的终末世界中,有两位少女漫无目的地持续着旅行。千户与尤莉,今天也乘着爱车Kettenkrad,在废墟当中彷徨。 在终末世界中温暖地求生的反乌托邦幻想剧,就此开幕
为了在这个荒无人烟的世界上生存下去千户和尤梨不得不解决眼前的困难那就是找食物,在这个(n*m)迷宫里两人的坐标在(x,y),两人想要得到箱子里的食物就必须要找到钥匙,现在她们两人并不知道钥匙和箱子的位置她们两人很饿所以请你给他们规划一下路线让他们两人能够尽快吃到东西。输出最少要走的步数
输入
第一行两个数 n ,m 表示 迷宫的大小(n,m<1000)
第2行到 第 n+1 行 每行m个字符,"*"代表墙壁不可走 “.”代表可走 ‘S’ 钥匙 'T' 箱子的位置
n+2行 两个数 x,y 代表两人的起始位置 (只能走上下左右四个方向)
输出
能找到食物输出最少要走的步数 不能找到输出“-1”;
样例输入
3 3
S.*
..T
***
1 2
样例输出
4
提示
S T 唯一且保证存在 S T保证不再一个格子里
没有找到钥匙之前 箱子的位置是不可走的
初始位置不可能在钥匙和箱子所在的格子
数据应该就4组.....无力吐槽....
两次bfs直接水过
ac:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
//#define mod 1e9+7
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
const int MAXN=1e5+5;
struct node{
int x,y;
bool friend operator == (node a,node b){
if(a.x==b.x&&a.y==b.y)
return 1;
else
return 0;
}
};
char mp[1010][1010];
int dis[1010][1010];
int fx[4]={0,0,1,-1},fy[4]={1,-1,0,0};
node t1,t2;
int n,m;
bool judge(node v)
{
if(v.x>0&&v.x<=n&&v.y>0&&v.y<=m)//地图中
{
if(mp[v.x][v.y]=='.'&&dis[v.x][v.y]==-1)
return 1;
}
return 0;
}
int find_S(node u)
{
clean(dis,-1);
queue<node> que;
dis[u.x][u.y]=0;
que.push(u);
while(que.size())
{
u=que.front();
que.pop();
//cout<<u.x<<" "<<u.y<<endl;
if(u==t1)
return dis[u.x][u.y];
for(int i=0;i<4;++i)
{
node v;
v.x=u.x+fx[i],v.y=u.y+fy[i];
if(judge(v)||mp[v.x][v.y]=='S')
{
que.push(v);
dis[v.x][v.y]=dis[u.x][u.y]+1;
}
}
}
return -1;
}
int find_T(node u)
{
clean(dis,-1);
queue<node> que;
dis[u.x][u.y]=0;
que.push(u);
while(que.size())
{
u=que.front();
que.pop();
if(u==t2)
return dis[u.x][u.y];
for(int i=0;i<4;++i)
{
node v;
v.x=u.x+fx[i],v.y=u.y+fy[i];
if(judge(v)||mp[v.x][v.y]=='T')
{
que.push(v);
dis[v.x][v.y]=dis[u.x][u.y]+1;
}
}
}
return -1;
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
cin>>mp[i][j];
if(mp[i][j]=='S')
t1.x=i,t1.y=j;
else if(mp[i][j]=='T')
t2.x=i,t2.y=j;
}
}
node s;
cin>>s.x>>s.y;
int f1=find_S(s);
if(f1==-1)
{
cout<<-1<<endl;
return 0;
}
int f2=find_T(t1);
if(f2==-1)
cout<<-1<<endl;
else
cout<<f1+f2<<endl;
}