华师一附中OI组
标题:
刘伟杰李香来程序大楼
[打印本页]
作者:
admin
时间:
2018-10-16 19:03
标题:
刘伟杰李香来程序大楼
这是刘,李两位同学的程序暂存大楼,他们的程序写在这里,自己欣赏
作者:
刘伟杰
时间:
2018-10-16 21:04
本帖最后由 刘伟杰 于 2018-10-16 21:07 编辑
luogu p1095 守望者的逃离 水题
思路:dp+贪心
AC代码:
#include <bits/stdc++.h>
using namespace std;
int dp[15000000];
int m,s,t;
int main()
{
scanf("%d%d%d",&m,&s,&t);
int i;
for(i = 1;i <= t;i++)
{
if(m >= 10)
{
m -= 10;
dp[i] = dp[i-1] + 60;
}else
{
m+=4;
dp[i] = dp[i-1];
}
}
for(i = 1;i <= t;i++)
{
dp[i] = max(dp[i-1]+17,dp[i]);
if(dp[i] >= s)
{
printf("Yes\n%d",i);
return 0;
}
}
printf("No\n%d",dp[t]);
return 0;
}
复制代码
作者:
刘伟杰
时间:
2018-10-16 21:06
luogu p1098 字符串展开 模拟
特判比较多
AC代码
#include <bits/stdc++.h>
using namespace std;
char a[100000];
int p1,p2,p3;
char bg;
char ed;
int main()
{
scanf("%d%d%d",&p1,&p2,&p3);
scanf("%s",a);
int len = strlen(a);
for(int i = 0;i < len;i++)
{
if(a[i] != '-')
{
printf("%c",a[i]);
}else
{
if(a[i-1] == '-')
{
printf("-");
continue;
}
if(a[i-1] >= a[i+1])
{
printf("-");
continue;
}
if(a[i+1] - a[i-1]> 27)
{
printf("-");
continue;
}
if(a[i+1] - a[i-1] == 1) continue;
if(p1 == 1)
{
if(p3 == 2)
{
ed = a[i-1] + 1;
bg = a[i+1] - 1;
for(int j = bg;j >= ed;j--)
{
char z = j;
for(int k = 1;k <= p2;k++)
{
printf("%c",z);
}
}
}else
{
bg = a[i-1] + 1;
ed = a[i+1] - 1;
for(int j = bg;j <= ed;j++)
{
char z = j;
for(int k = 1;k <= p2;k++)
{
printf("%c",z);
}
}
}
}
if(p1 == 3)
{
if(p3 == 2)
{
ed = a[i-1] + 1;
bg = a[i+1] - 1;
for(int j = bg;j >= ed;j--)
{
for(int k = 1;k <= p2;k++)
{
printf("*");
}
}
}else
{
bg = a[i-1] + 1;
ed = a[i+1] - 1;
for(int j = bg;j <= ed;j++)
{
for(int k = 1;k <= p2;k++)
{
printf("*");
}
}
}
}
if(p1 == 2)
{
if(p3 == 2)
{
ed = a[i-1] + 1;
bg = a[i+1] - 1;
for(int j = bg;j >= ed;j--)
{
char z = j;
if(z > 96)
{
z = z - 32;
}
for(int k = 1;k <= p2;k++)
{
printf("%c",z);
}
}
}else
{
bg = a[i-1] + 1;
ed = a[i+1] - 1;
for(int j = bg;j <= ed;j++)
{
char z = j;
if(z > 96)
{
z = z - 32;
}
for(int k = 1;k <= p2;k++)
{
printf("%c",z);
}
}
}
}
}
}
return 0;
}
复制代码
作者:
刘伟杰
时间:
2018-10-16 21:19
luogu UVA253 cube painting
穷举 可以用到数学思想:不管骰子怎么转动,相对的两面不变。
穷举AC代码:
#include<bits/stdc++.h>
using namespace std;
int dir[6][6] = { { 0, 1, 2, 3, 4, 5 }, { 1, 0, 3, 2, 5, 4 }, { 2, 0, 1, 4, 5, 3 }, { 3, 0, 4, 1, 5, 2 }, { 4, 0, 2, 3, 5, 1 }, { 5, 1, 3, 2, 4, 0 } };
char a[10],b[10],s[20];
bool judge()
{
for (int i=0; i<6; i++)
{
char temp[10]="";
for (int j=0; j<6; j++)
temp[j]=a[dir[i][j]];
for (int j=0; j<4; j++)
{
char c_temp;
c_temp=temp[1];
temp[1]=temp[2];
temp[2]=temp[4];
temp[4]=temp[3];
temp[3]=c_temp;
if (strcmp(temp,b)==0) return true;
}
}
return false;
}
int main()
{
while (scanf("%s",s)!=EOF)
{
for (int i=0; i<6; i++)
a[i]=s[i];
a[6]=0;
for (int i=0; i<6; i++)
b[i]=s[i+6];
b[6]=0;
if (judge()) printf("TRUE\n");
else printf("FALSE\n");
}
}
复制代码
作者:
刘伟杰
时间:
2018-10-16 21:26
luogu p1598 垂直柱状图
过水,注意输出
模拟
AC代码:
#include <bits/stdc++.h>
using namespace std;
string k[10];
int m;
int len[5];
int counts[27];
int ans;
void f(int x)
{
int i;
for(i = 0; i < len[x]; i++)
{
if(k[x][i] == 'A') counts[1]++;
if(k[x][i] == 'B') counts[2]++;
if(k[x][i] == 'C') counts[3]++;
if(k[x][i] == 'D') counts[4]++;
if(k[x][i] == 'E') counts[5]++;
if(k[x][i] == 'F') counts[6]++;
if(k[x][i] == 'G') counts[7]++;
if(k[x][i] == 'H') counts[8]++;
if(k[x][i] == 'I') counts[9]++;
if(k[x][i] == 'J') counts[10]++;
if(k[x][i] == 'K') counts[11]++;
if(k[x][i] == 'L') counts[12]++;
if(k[x][i] == 'M') counts[13]++;
if(k[x][i] == 'N') counts[14]++;
if(k[x][i] == 'O') counts[15]++;
if(k[x][i] == 'P') counts[16]++;
if(k[x][i] == 'Q') counts[17]++;
if(k[x][i] == 'R') counts[18]++;
if(k[x][i] == 'S') counts[19]++;
if(k[x][i] == 'T') counts[20]++;
if(k[x][i] == 'U') counts[21]++;
if(k[x][i] == 'V') counts[22]++;
if(k[x][i] == 'W') counts[23]++;
if(k[x][i] == 'X') counts[24]++;
if(k[x][i] == 'Y') counts[25]++;
if(k[x][i] == 'Z') counts[26]++;
}
}
int main()
{
for(int i = 1; i <= 4; i++)
{
getline(cin,k[i]);
len[i] = k[i].size();
}
for(int i = 1; i <= 4; i++)
{
f(i);
}
for(int i = 1; i <= 26; i++)
{
ans = max(ans,counts[i]);
}
m = ans;
for(int i = 1; i <= ans; i++)
{
for(int j = 1; j <= 26; j++)
{
if(counts[j] >= m)
{
printf("* ");
}
else
{
printf(" ");
}
}
m--;
printf("\n");
}
printf("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");
return 0;
}
复制代码
作者:
admin
时间:
2018-10-17 09:51
楼上的此题函数f应该用数组直接跳转
作者:
刘伟杰
时间:
2018-10-17 18:55
luogu
P1691 有重复元素的排列问题
我绝对不会说我是用stl的
下面附上AC代码:
#include <bits/stdc++.h>
using namespace std;
char s1[1000];
char s2[1000];
int ans;
int main()
{
int n;
scanf("%d",&n);
scanf("%s",s1);
sort(s1,s1+n);
do{
for(int i = 0;i < n;i++)
{
printf("%c",s1[i]);
}
ans++;
printf("\n");
}while(next_permutation(s1,s1+n));
printf("%d",ans);
return 0;
}
复制代码
作者:
刘伟杰
时间:
2018-10-17 19:14
本帖最后由 刘伟杰 于 2018-10-17 19:25 编辑
luogu
P1706 全排列问题
其实我是特别想用stl的
方法:裸dfs就ok
附上AC代码:
#include <bits/stdc++.h>
using namespace std;
int a[100];
int book[100];
int n;
void print()
{
for(int i = 1;i <= n;i++)
{
printf("%5d",a[i]);
}
printf("\n");
}
void dfs(int x)
{
if(x == n+1)
{
print();
return;
}
for(int i = 1;i <= n;i++)
{
if(book[i] == 0)
{
book[i] = 1;
a[x] = i;
dfs(x+1);
book[i] = 0;
}
}
}
int main()
{
scanf("%d",&n);
dfs(1);
return 0;
}
复制代码
作者:
刘伟杰
时间:
2018-10-17 19:15
本帖最后由 刘伟杰 于 2018-10-17 19:26 编辑
luogu
P1157 组合的输出
这跟全排列有区别吗。。。有一点吧
裸dfs
AC代码:
#include <bits/stdc++.h>
using namespace std;
int a[100];
int book[100];
int n;
int k;
int c;
void print()
{
for(int i = 1;i <= k;i++)
{
printf("%3d",a[i]);
}
printf("\n");
}
void dfs(int x)
{
if(x == k+1)
{
print();
return;
}
for(int i = a[x-1];i <= n;i++)
{
if(book[i] == 0)
{
book[i] = 1;
a[x] = i;
dfs(x+1);
book[i] = 0;
}
}
}
int main()
{
scanf("%d%d",&n,&k);
a[0] = 1;
dfs(1);
return 0;
}
复制代码
作者:
刘伟杰
时间:
2018-10-17 19:17
刘伟杰 发表于 2018-10-17 18:55
luogu P1691 有重复元素的排列问题
我绝对不会说我是用stl的
其实应该用搜索的,我错了
作者:
admin
时间:
2018-10-18 11:53
刘伟杰 发表于 2018-10-17 19:17
其实应该用搜索的,我错了
这个很有用,也需要掌握!
作者:
刘伟杰
时间:
2018-10-19 19:10
luogu P1036 选数
一个质数判断加一个裸dfs即可
AC代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int s[10000];
int k;
int ans;
bool judge(int x)
{
if(x == 1 || x == 0) return false;
if(x == 2) return true;
for(int i = 2;i <= x/2;i++)
{
if(x % i == 0) return false;
}
return true;
}
void dfs(int step,int cnt,int sum)
{
if(step == n+1 || cnt == k)
{
if(cnt == k && judge(sum)) ans++;
return;
}
dfs(step+1,cnt+1,sum+s[step]);
dfs(step+1,cnt,sum);
return;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i = 1;i <= n;i++) scanf("%d",&s[i]);
dfs(1,0,0);
printf("%d",ans);
return 0;
}
复制代码
作者:
刘伟杰
时间:
2018-10-19 19:13
luogu P1123
取数游戏(差点做成网络流24。。)
因为周围8个不能取,所以从第一排第一列开始搜,剪枝只用判断左边和上边就ok,也是裸搜加一点点技巧
不知为何输出卡了半天。。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,t;
int maps[1000][1000];
int book[1000][1000];
int s[1000];
int ans = 0;
void dfs(int sum,int x,int y)
{
if(x > n)
{
ans = max(ans,sum);
return;
}
int tx = x;
int ty = y+1;
if(ty > m)
{
tx++;
ty = 1;
}
if(!book[x-1][y+1] && !book[x-1][y-1] && !book[x][y-1] && !book[x-1][y])
{
book[x][y] = 1;
dfs(sum+maps[x][y],tx,ty);
book[x][y] = 0;
}
dfs(sum,tx,ty);
}
int main()
{
scanf("%d",&t);
while(t--)
{
ans = 0;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
scanf("%d",&maps[i][j]);
}
}
dfs(0,1,0);
printf("%d\n",ans);
}
return 0;
}
复制代码
作者:
刘伟杰
时间:
2018-10-19 19:17
luogu P1443 马的遍历
普及广搜
其实这题广搜确实比深搜简单,于是就广搜做了。。
把马八个方向先预处理一下,然后就是基本的广搜了。。弄一个变量更新最小值,跟走迷宫其实区别不大
AC代码:
#include <bits/stdc++.h>
using namespace std;
struct note{
int x;
int y;
};
int maps[401][401];
int k;
int n,m,startx,starty;
int s;
int tx,ty;
int i,j;
int next[8][2] = {{2,1},{2,-1},{1,2},{1,-2},{-1,2},{-1,-2},{-2,1},{-2,-1}};
int main()
{
struct note que[40001];
memset(maps,-1,sizeof(maps));
int head = 1;
int tail = 1;
scanf("%d%d%d%d",&n,&m,&startx,&starty);
tail++;
que[tail].x = startx;
que[tail].y = starty;
maps[que[tail].x][que[tail].y] = 0;
while(head < tail)
{
head++;
s = maps[que[head].x][que[head].y] + 1;
for(k = 0;k < 8;k++)
{
tx = que[head].x + next[k][0]; ty = que[head].y + next[k][1];
if(maps[tx][ty] == -1 && tx >= 1 && tx <= n && ty >= 1 && ty <= m)
{
tail++;
que[tail].x = tx;
que[tail].y = ty;
maps[tx][ty] = s;
}
}
}
for(i = 1;i <= n;i++)
{
for(j = 1;j <= m;j++)
{
printf("%-5d",maps[i][j]);
}
printf("\n");
}
return 0;
}
复制代码
作者:
刘伟杰
时间:
2018-10-19 19:20
luogu P2404 自然数的拆分问题
这题以前做过一个类似的。。。但到现在都有点没搞懂。。。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int s[1000] = {1};
int n;
int k;
void print(int x)
{
for(int i = 1;i < x;i++)
{
printf("%d+",s[i]);
}
printf("%d",s[x]);
printf("\n");
}
void dfs(int x)
{
for(int i = s[x-1];i <= k;i++)
{
if(i == n) continue;
s[x] = i;
k -= i;
if(k == 0) print(x);
else dfs(x+1);
k+=i;
}
}
int main()
{
scanf("%d",&n);
k = n;
dfs(1);
return 0;
}
复制代码
作者:
刘伟杰
时间:
2018-10-19 19:43
luogu P1238 走迷宫
3次才AC 第一次 50 第二次 80 第三次 100
分析原因:
1、上下左右看错????
2、初始位置要标记。。。
3、这其实就是一道水题。。。。
迷宫类型问题的基本套路,记得剪枝,不然要tle的。。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int maps[1000][1000];
int book[1000][1000];
int a[1000][3];
int next[4][2] = {{0,-1},{-1,0},{0,1},{1,0}};
int n,m;
int flag;
int p,q,sx,sy;
void print(int x)
{
for(int i = 1;i < x;i++)
{
printf("(%d,%d)->",a[i][1],a[i][2]);
}
printf("(%d,%d)",a[x][1],a[x][2]);
printf("\n");
}
void dfs(int x,int y,int step)
{
int tx,ty;
if(x == p && y == q)
{
flag = 1;
print(step);
return;
}
for(int k = 0;k <= 3;k++)
{
tx = x + next[k][0];
ty = y + next[k][1];
if(tx < 1 || tx > n || ty < 1 || ty > m) continue;
if(book[tx][ty] == 0 && maps[tx][ty] == 1)
{
book[tx][ty] = 1;
a[step+1][1] = tx;
a[step+1][2] = ty;
dfs(tx,ty,step+1);
book[tx][ty] = 0;
}
}
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i = 1;i <= n;i++)
{
for(j = 1;j <= m;j++)
{
scanf("%d",&maps[i][j]);
}
}
scanf("%d%d",&sx,&sy);
scanf("%d%d",&p,&q);
a[1][1] = sx;
a[1][2] = sy;
book[sx][sy] = 1;
dfs(sx,sy,1);
if(flag == 0)
{
printf("-1");
}
return 0;
}
复制代码
作者:
刘伟杰
时间:
2018-10-26 19:23
luogu P1233 木棍加工
先排序,再寻找最大不上升序列
贪心思想。。。没用dp。
#include <bits/stdc++.h>
using namespace std;
struct Mugun{
int l;
int w;
int book;
}m[100000];
int n;
int ans = 0;
int cmp(struct Mugun a,struct Mugun b)
{
return a.l > b.l;
if(a.l == b.l)
return a.w > b.w;
}
int temp;
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;i++)
{
scanf("%d%d",&m[i].l,&m[i].w);
m[i].book = 0;
}
sort(m+1,m+1+n,cmp);
for(int i = 1;i <= n;i++)
{
if(m[i].book == 0)
{
temp = m[i].w;
for(int j = i+1;j <= n;j++)
{
if(m[j].w<=temp&&m[j].book == 0)
{
m[j].book = 1;
temp = m[j].w;
}
}
}
}
for(int i = 1;i <= n;i++)
{
if(m[i].book == 0)
{
ans++;
}
}
printf("%d",ans);
return 0;
}
复制代码
作者:
刘伟杰
时间:
2018-10-26 19:24
luogu P1216 数字三角形
DP。。。吧
#include <bits/stdc++.h>
using namespace std;
int n,a[1002],i,j,ans,p;
int main()
{
scanf("%d",&n);
for(i=n;i;i--)
for(j=i;j<=n;j++)
scanf("%d",&p),a[j]=max(a[j],a[j+1])+p;
for(i=1;i<=n;i++)
ans=max(ans,a[i]);
printf("%d",ans);
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2