Wannafly Union#1
题目链接:http://vjudge.net/contest/142053#overview
A.题意:有一个3*n的隧道,人和车轮流走,人先向右走一步,然后选在是在原地不动还是上下移动一格,之后车开始往左移两格,问人是否能走到隧道尽头
思路:车是不会上下动的,那么我们按照相对来算就行,也就是人相当于往右走一步,然后选择不动还是上下移动一格,然后往右走两步。bfs处理把能走到的点加入到队列
bfs和dp其实思路是一样的,都是从左到右递推过去的
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <queue>
using namespace std;
char G[][];
bool flag[][];
int n;
bool vis;
struct node{
int x,y;
};
bool judge(int x,int y){
return G[x][y]=='.';
}
bool ok(node &temp){
if(judge(temp.x,temp.y)){
if(judge(temp.x,temp.y+)){
if(temp.y+==n) vis=true;
}
if(judge(temp.x,temp.y+)&&judge(temp.x,temp.y+)){
if(temp.y+==n||temp.y+==n) vis=true;
}
if(judge(temp.x,temp.y+)&&judge(temp.x,temp.y+)){
temp.y+=;
if(!flag[temp.x][temp.y]){
return true;
}
}
}
return false;
}
bool bfs(int posx,int posy){
memset(flag,false,sizeof(flag));
queue<node> q;
vis=false;
while(!q.empty()) q.pop();
node e;
e.x=posx,e.y=posy;
q.push(e);
flag[e.x][e.y]=true;
while(!q.empty()){
node tmp=q.front();
q.pop();
if(tmp.y==n) return true;
else {
node temp,tmpup,tmpdown;
temp=tmp;
temp.y=tmp.y+;
if(!judge(temp.x,temp.y)) continue;
if(temp.y==n) return true;
tmpup=temp,tmpup.x+=;
tmpdown=temp,tmpdown.x-=;
if(ok(temp)){
q.push(temp);
flag[temp.x][temp.y]=true;
}
if(ok(tmpup)){
q.push(tmpup);
flag[tmpup.x][tmpup.y]=true;
}
if(ok(tmpdown)){
q.push(tmpdown);
flag[tmpdown.x][tmpdown.y]=true;
}
if(vis) return true;
}
}
return false;
}
void solve(int T){
int k;
scanf("%d %d",&n,&k);
int x,y;
for(int i=;i<=;i++){
for(int j=;j<=n;j++){
scanf(" %c",&G[i][j]);
if(G[i][j]=='s') {
x=i,y=j;
}
}
}
if(bfs(x,y)){
printf("YES\n");
}
else
printf("NO\n");
return ;
}
int main(){
int T;
while(scanf("%d",&T)!=EOF){
for(int i=;i<=T;i++) solve(i);
}
}
B.题意:有一个字符串,看能不能在字符串的任意位置插入一个字符串使得这个字符串是回文串
思路:水题,暴力插入
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
char str[];
char tmp[];
bool judge(int len){
for(int i=;i<=len;i++){
if(tmp[i]!=tmp[len-i]){
return false;
}
}
return true;
}
void solve(){
int len=strlen(str);
for(int i=;i<=len;i++){
for(int j=;j<;j++){
tmp[i]='a'+j;
for(int k=;k<i;k++) tmp[k]=str[k];
for(int k=i+;k<=len;k++) tmp[k]=str[k-];
if(judge(len)){
for(int k=;k<=len;k++){
printf("%c",tmp[k]);
}
printf("\n");
return ;
}
}
}
printf("NA\n");
return ;
}
int main(){
while(scanf("%s",str)!=EOF){
solve();
}
return ;
}
D.题意:有一个n*n的棋盘,白棋在(1,1),黑棋(1,n),其余的地方都是绿棋子,棋子的走法和国际象棋里面的皇后一样,白棋和黑棋走的路上必须吃子
当某个棋子不能吃子或者被对手吃了就算输了,输出谁输,如果白棋赢输出白棋走的第一步,l和c都尽量小
思路:如果棋盘是奇数的话,白棋先手,黑棋走白棋的镜像,这样的话相当于当白棋走到中间时,黑棋总能把它吃掉。
如果棋盘是偶数的话,白棋先手走(1,2)这样相当于把棋盘变成奇数并且黑棋先手了,那样黑棋必输,而白棋总能通过先走(1,2)来赢
#include <stdio.h>
int main(){
int n;
while(scanf("%d",&n)!=EOF){
if(n&)printf("black\n");
else {
printf("white\n1 2\n");
}
}
return ;
}
F:题意:有很多个约束条件,输出满足约束条件的任意一个数
思路:设一个l,r表示上界和下界,不断夹就行,矛盾就不行(代码有点丑QwQ)
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
char str[];
int num;
char type[];
void solve(int T){
int l=-2e9;
int r=2e9;
bool flag=true;
while(T--){
scanf("%s%d%s",str,&num,type);
if(type[]=='N'){
if(str[]=='>'){
if(str[]=='='){
if(num-<l){
flag=false;
continue;
}
r=min(r,num-);
}
else {
if(num<l) {
flag=false;
continue;
}
r=min(r,num);
}
}
if(str[]=='<'){
if(str[]=='='){
if(num+>r){
flag=false;
continue;
}
l=max(l,num+);
}
else {
if(num>r){
flag=false;
continue;
}
l=max(num,l);
}
}
}
else {
if(str[]=='>'){
if(str[]=='='){
if(num>r){
flag=false;
continue;
}
l=max(l,num);
}
else {
if(num+>r){
flag=false;
continue;
}
l=max(num+,l);
}
}
if(str[]=='<'){
if(str[]=='='){
if(num<l) {
flag=false;
continue;
}
r=min(r,num);
}
else {
if(num-<l){
flag=false;
continue;
}
r=min(r,num-);
}
}
}
}
if(!flag){
printf("Impossible\n");
return ;
}
for(int i=l;i<=r;i++){
printf("%d\n",i);
return ;
} }
int main(){
int T;
while(scanf("%d",&T)!=EOF){
solve(T);
}
}
E题填坑来了
题意:有一个n*n的方格,里面有m个棋子,每个棋子有自身的属性值p,现在有这样一个集合,集合内的棋子要满足都在一条斜线上,并且距离(斜线上的距离)要满足一个条件,dis(i,j)>=pi^2+pj^2+C(C为常数)
思路:假设xi>xj,那么dis(i,j)=xi-xj+1 xi-xj+1>=pi^2+pj^2+C ---> xi-pi^2>=xj+pj^2+C-1 假设左边为A[i],右边为B[i],这样每个点都有属性ai,bi,把每条斜线按照x的升序排列,然后用类似nlogn求LIS的方法求出每条斜线上最多,我设a=x-p^p b=x+p^p+c-1,那么肯定B[i]>A[i],也就是如果你在序列中找到了这个点插入的位置,就可以直接插入,因为B[i]不可能在前面
能在集合里面加几个点假设xi>xj>xk 那么dis(i,k)=dis(i,j)+dis(j,k)-1>=pi^2+2*pj^2+pk^2+2*C-1>pi^2+pk^2+C 也就是只要相邻的满足条件,那么这个点肯定跟整个集合里面的满足条件
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
const int maxn=1e5+;
int n,m,C;
struct node{
long long x,y,p;
node(){};
long long a,b;
node(int x_,int y_,int p_):x(x_),y(y_),p(p_){
a=x-p*p,b=x+p*p+C-;
}
};
vector<node> G1[*maxn];
vector<node> G2[*maxn];
set<int> s1;
set<int> s2;
set<int> ::iterator it;
int siznum;
bool cmp(const node&tmp1,const node&tmp2){
return tmp1.x<tmp2.x;
}
int ans=;
long long q[maxn];
void cal(vector<node> G[*maxn],set<int> s){
for(it=s.begin();it!=s.end();it++){
int num=*it;
int cnt=;
sort(G[num].begin(),G[num].end(),cmp);
for(int i=;i<G[num].size();i++){
int pos=upper_bound(q,q+cnt,G[num][i].a)-q;
if(pos==cnt){
q[cnt++]=G[num][i].b;
}
else {
if(q[pos]>G[num][i].b){
q[pos]=G[num][i].b;
}
}
}
ans=max(ans,cnt);
}
}
node point[maxn];
long long num[maxn<<];
void solve(){
ans=;
scanf("%d %d %d",&n,&m,&C);
for(int i=;i<(*maxn);i++) G1[i].clear(),G2[i].clear();
s1.clear(),s2.clear();
long long x,y,p;
for(int i=;i<=m;i++){
scanf("%lld %lld %lld",&x,&y,&p);
point[i]=node(x,y,p);
s1.insert(x+y);
s2.insert(y-x+maxn);
G1[x+y].push_back(point[i]);
G2[y-x+maxn].push_back(point[i]);
}
cal(G1,s1);
cal(G2,s2);
printf("%d\n",ans);
}
int main(){
int T;
freopen("bishops.in","r",stdin);
scanf("%d",&T);
while(T--){
solve();
}
}
C题放弃QAQ
非常感激大佬们挂题讲题QAQ
Wannafly Union#1的更多相关文章
- Wannafly Union Goodbye 2016
A 题意:平面上有n个点(n<=100000),给你一个p(20<=p<=100) 判断是否存在一条直线至少过[np/100](向上取整)个点,时限20s,多组数据 分析:概率算法 ...
- 【Mutual Training for Wannafly Union #1 】
A.Phillip and Trains CodeForces 586D 题意:过隧道,每次人可以先向前一格,然后向上或向下或不动,然后车都向左2格.问能否到达隧道终点. 题解:dp,一开始s所在列如 ...
- Mutual Training for Wannafly Union #1解题报告
---恢复内容开始--- q神等人组织的vjudge上的多校训练,题目基本上都来自于CF,#1是上周进行的,参加后感觉收获很多,因为上周准备期中比较忙,解题报告现在补上. 比赛地址(兼题目地址) A题 ...
- Mutual Training for Wannafly Union #6 E - Summer Trip(并查集)
题目链接:http://www.spoj.com/problems/IAPCR2F/en/ 题目大意: 给m个数字代表的大小,之后n组数据,两两关联,关联后的所有数字为一组,从小到大输出组数以及对应的 ...
- Mutual Training for Wannafly Union #2
codeforces 298A. Snow Footprints 分类讨论三种情况: ①..RRRRRR… ②..LLLLLLL… ③..RRRLLLL.. //AC by lwq: #includ ...
- Wannafly Union Goodbye 2016-A//初识随机化~
想来想去还是把这个题写下来了.自己在补题遇到了许多问题. 给出n(n<=1e5)个点,求是否存在多于p(p>=20)×n/100的点在一条直线上... 时限20s,多组数据,暴力至少n^2 ...
- Mutual Training for Wannafly Union #8 D - Mr.BG Hates Palindrome 取余
Mr.BG is very busy person. So you have been given enough time (1000 milliseconds) to help him. Mr. B ...
- Mutual Training for Wannafly Union #9
A(SPOJ NPC2016A) 题意:给一个正方形和内部一个点,要求从这个点向四边反射形成的路线的长度 分析:不断做对称,最后等价于求两个点之间的距离 B(CF480E) 题意:求01矩阵内由0组成 ...
- Mutual Training for Wannafly Union #6
A =w= B QvQ C 题意:有长度为n的序列(n<=5e5),求满足条件的a,b,c,d的组数,要求满足条件:min([a,b])<=min([c,d]),a<=b<c& ...
随机推荐
- Android apk安装时出现“解析软件包错误”
有时候在安装apk的时候会出现解析软件包出错 (Android studio)解决方法如下: 关闭Instant Run功能: File-Settings-...看下图: 将红色框内的勾取消. 如果还 ...
- 【学习笔记】【Javaweb】二、Session对象过期时间三种设置方法、Session失效监听器
一.前言 本文:https://www.cnblogs.com/Twobox/p/10361712.html 参考:https://www.cnblogs.com/diewufeixian/p/422 ...
- c#二进制移位运算符 "<<"及">>","&","|","^"
移位运算符 & :按位与,其实与&&逻辑运算符有一致的地方: | :按位或,同样与||有类似的地方. ~:按位取反 ^:按位异或 <<:左移运算符 >> ...
- c# winform多线程实时更新控件
//创建委托 private delegate void SetTextCallback(string text); /// <summary> / ...
- 实战项目中Java heap space错误的解决
部标GPS通讯系统在上线之后,经过不断调试,终于稳定运行一段时间,后来又遇到了Java heap space错误异常!日志如下: 说明系统中有未释放的对象.如何找出这些未释放对象以及监控JVM堆内存, ...
- JS时间的获取及格式
最近在做一个web聊天室,一个时间的问题挡住了进程,只好全网大搜索,将实用的方法记录下来,以备后查 <script src="/static/bootstrap/js/jquery.m ...
- Java 集合系列(四)—— ListIterator 源码分析
以脑图的形式来展示Java集合知识,让零碎知识点形成体系 Iterator 对比 Iterator(迭代器)是一种设计模式,是一个对象,用于遍历集合中的所有元素. Iterator 包含四个方法 ...
- PHP程序污点型漏洞静态检测方法
这篇文献,作者针对基于PHP语言开发的web应用程序产生的污点型漏洞,提出了一种静态代码分析检测的方法. 先解释一下什么叫污点型漏洞,由于对于用户的输入没有进行有效的过滤,使其进入敏感函数 ...
- Linux中删除特殊名称文件的多种方式
今日分享:我们在肉体的疾病方面花了不少钱,精神的病害方面却没有花什么,现在已经到了时候,我们应该有不平凡的学校.--<瓦尔登湖> 前言 我们都知道,在linux删除一个文件可以使用rm命令 ...
- springboot项目屏蔽mq或者mongodb的监控日志输出
最近写项目,用的是springboot,其中用到了rabbitmq和mongodb,配置完成 项目启动后,会输出如下日志: mongodb和mq的检测,会一直打印日志,这样会影响开发人员的测试. 如何 ...