A 海岛争霸

题目:Q次询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少。

多源点最短路,用floyd

在松弛更新:g[i][k] < g[i][j] && g[k][j] < g[i][j]时,g[i][j] = max(g[i][k],g[k][j]);

#include<bits/stdc++.h>
using namespace std; const int maxn = 510;
int n,m;
int q;
int g[maxn][maxn]; const int inf = 0x3f3f3f3f;
// 初始化 g 矩阵
void init() {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (i == j) {
g[i][j] = 0;
} else {
g[i][j] = inf;
}
}
}
} // 插入一条带权有向边
void insert(int u, int v, int w) {
g[u][v] = w;
} // 核心代码
void floyd() {
for (int k = 1; k <= n; ++k) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
//这里是本题的核心 松弛更新
if(g[i][k] < g[i][j] && g[k][j] < g[i][j]){
g[i][j] = max(g[i][k],g[k][j]);
}
}
}
}
} int main(){
cin>>n>>m;
init();
for(int i=1;i<=m;i++){
int a,b,v;
cin>>a>>b>>v;
if(v < g[a][b]){
insert(a,b,v);
insert(b,a,v);
}
} floyd(); cin>>q;
while(q--){
int a,b;
cin>>a>>b;
if(g[a][b] == inf){
cout<<-1<<endl;
}else{
cout<<g[a][b]<<endl;
}
}
return 0;
}

*B 物资调度

1.dfs剪枝都能过。。

2.dp当然也可以,0-1背包

3.二进制枚举wa了

#include<bits/stdc++.h>
using namespace std; //AC const int maxn = 110;
int t;
int n,m;
int a[maxn];
int vis[maxn];
int ans = 0; //第k个数 当前值为sum
void dfs(int k,int sum){
if(sum > m) return;
if(k==n+1){
if(sum == m){
ans++;
}
return;
}
//每个数有两种选择:用这个数 和 不用这个数 都dfs搜索一遍
dfs(k+1,sum);//不用这个数
if(sum + a[k]<=m){
dfs(k+1,sum+a[k]);//用这个数 sum就需要加上当前这个数的值
}
} int main(){
cin>>t;
while(t--){
ans = 0;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
memset(vis,0,sizeof(vis));
dfs(1,0);
cout<<ans<<endl;
}
return 0;
}

二进制枚举做法

#include<bits/stdc++.h>
using namespace std; //WA const int maxn = 110;
int t;
int n,m;
int a[maxn]; int main(){
cin>>t;
while(t--){
int ans = 0;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
//枚举0 ~ 1<<n种状态
for(int i=0; i<(1<<n); i++){
int sum = 0;
for(int j=1;j<=n;j++){
if(i & (1<<(j-1))){
sum += a[j];
}
}
if(sum == m){
// cout<<i<<endl;
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}

*D 山区修路

我只能写个2次dp的 暴力解法,但是这里ai 有1e9这么大,wa。

再补题。

#include<bits/stdc++.h>
using namespace std; const int maxn = 510;
int t;
int n;
int dp[maxn][maxn][2];
int a[maxn];
const int inf = 0x3f3f3f3f; int main(){
cin>>t;
while(t--){
cin>>n;
int maxh = 0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i] > maxh) maxh = a[i];
}
memset(dp,inf,sizeof(dp));
for(int i=0;i<=maxh;i++){
dp[1][i][0] = abs(a[1] - i);
dp[1][i][1] = abs(a[1] - i);
} //从前推 低->高
for(int i=2;i<=n;i++){
for(int j=0;j<=maxh;j++){
for(int k=0;k<=j;k++){
dp[i][j][0] = min(dp[i][j][0],dp[i-1][k][0] + abs(a[i] - j));
}
}
} //从前推 高->低
for(int i=2;i<=n;i++){
for(int j=0;j<=maxh;j++){
for(int k=j;k<=maxh;k++){
dp[i][j][1] = min(dp[i][j][1],dp[i-1][k][1] + abs(a[i] - j));
}
}
} int ans = inf;
for(int i=0;i<=maxh;i++){
if(dp[n][i][1] < ans) ans = dp[n][i][1];
if(dp[n][i][0] < ans) ans = dp[n][i][0];
}
cout<<ans<<endl;
} return 0;
}

F Turing equation

题意:看样例能猜到,the numbers being read backwards.

从后往前将字符串 转成三个数,判断和是否相等

#include<bits/stdc++.h>
using namespace std; string s; int main(){
while(cin>>s && !(s[0] == '0' && s[1] == '+' && s[2] == '0' && s[3] == '=' && s[4] == '0' )){
int len = s.length() - 1;
int c = 0;
int b = 0;
int a = 0; int i = len;
while(i>=0 && s[i] == '0') i--;
while(i>=0 && s[i] >= '0' && s[i] <= '9'){
c = c*10 + (s[i]- '0');
i--;
if(s[i] == '=') break;
}
if(i>=0 && s[i] == '=') i--; while(i>=0 && s[i] == '0') i--;
while(i>=0 && s[i] >= '0' && s[i] <= '9'){
b = b*10 + (s[i]- '0');
i--;
if(s[i] == '+') break;
} if(i>=0 && s[i] == '+') i--;
while(i>=0 && s[i] == '0') i--;
while(i>=0 && s[i] >= '0' && s[i] <= '9'){
a = a*10 + (s[i]- '0');
i--;
}
if(a + b == c)
cout<<"TRUE"<<endl;
else
cout<<"FALSE"<<endl;
}
return 0;
}

H Rectangles

1.一眼递推

2.LIS的dp

题目英文,细节比较多

The list can be created from rectangles in any order and in either orientation. //长宽可以交换

A rectangle fits inside another rectangle if one of its sides is strictly smaller than the other rectangle's and the remaining side is no larger.//给了样例能懂

#include<bits/stdc++.h>
using namespace std; const int maxn = 110;
int t,n;
int a[maxn];
struct node{
int x;
int y;
}; //ac bool cmp(const node &p,const node &q){
if(p.x == q.x) return p.y < q.y;
return p.x < q.x;
} int main(){
cin>>t;
while(t--){
cin>>n;
node g[n+5];
for(int i=1;i<=n;i++){
int xi,yi;
cin>>xi>>yi;
if(xi < yi) swap(xi,yi); //这里是注意点
g[i].x = xi;
g[i].y = yi;
a[i] = 1;
}
sort(g+1,g+n+1,cmp); //排序
int ans = 1;
//递推
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if((g[j].x > g[i].x && g[j].y > g[i].y) || (g[j].x > g[i].x && g[j].y == g[i].y) || (g[j].x == g[i].x && g[j].y > g[i].y) ){
a[j] = max(a[j],a[i]+1);
}
}
}
for(int i=1;i<=n;i++){
if(a[i] > ans) ans = a[i];
}
cout<<ans<<endl;
}
return 0;
}

下面LIS最长上升子序列的写法,也AC的

#include<bits/stdc++.h>
using namespace std; //ac /*
A rectangle fits inside another rectangle if one of its sides is strictly smaller than the other rectangle's
and the remaining side is no larger.
If two rectangles are identical they are considered not to fit into each other.
For example, a 2*1 rectangle fits in a 2*2 rectangle, but not in another 2*1 rectangle.
容易看懂题意
*/ //The list can be created from rectangles in any order and in either orientation.
//意思是长宽可以交换 想法:那么我们在输入数据的时候把小的给长 大的给宽就可以了 const int maxn = 110;
int t,n;
int a[maxn];
struct node{
int x;
int y;
}; bool cmp(const node &p,const node &q){
if(p.x == q.x) return p.y < q.y;
return p.x < q.x;
} int main(){
cin>>t;
while(t--){
cin>>n;
node g[n+5];
for(int i=1;i<=n;i++){
int xi,yi;
cin>>xi>>yi;
if(xi < yi) swap(xi,yi);
g[i].x = xi;
g[i].y = yi;
a[i] = 1;
}
sort(g+1,g+n+1,cmp);
int ans = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if((g[j].x < g[i].x && g[j].y < g[i].y) || (g[j].x < g[i].x && g[j].y == g[i].y) || (g[j].x == g[i].x && g[j].y < g[i].y) ){
a[i] = max(a[i],a[j]+1);
}
}
}
for(int i=1;i<=n;i++){
if(a[i] > ans) ans = a[i];
}
cout<<ans<<endl;
}
return 0;
}

每天一套题打卡|河南省第七届ACM/ICPC的更多相关文章

  1. 每天一套题打卡|河南省第十届ACM/ICPC

    A.谍报分析 题意:请你编程,快速统计出频率高的前十个单词. 思路:字符串输入,map哈希表map<string,int >记录每个单词出现的次数,pair重载优先级 #include&l ...

  2. 每天一套题打卡|河南省第十一届ACM/ICPC

    A 计划日 题意:已知李明在YYYY年MM月DD日星期W订了学习计划,现在想看看李明N天后的完成情况和个人总结,你能告诉我那天的日期和星期几吗? 模拟日期计算: 计算星期可以用基姆拉尔森公式 //中国 ...

  3. 每天一套题打卡|河南省第八届ACM/ICPC

    A 挑战密室 化学方程式求分子量 这题我懒得写了 可以用map<string,int>哈希表,表示每种分子的相对分子质量 之后,从头遍历到尾. 1.数字:连读直到不是数字 2.字母:连读直 ...

  4. 每天一套题打卡|河南省第九届ACM/ICPC

    A 表达式求值 表达式求值:可以用递归求解,也可以用栈模拟,考过多次. 类似题目:NYOJ305,NYOJ35 用栈模拟做法: #include <stdio.h> #include &l ...

  5. 2014年河南省第七届ACM大赛总结

    虽然大赛已经结束了两天,不过比赛的场景还是不断地在眼前回放,一遍遍,这次的比赛给了我很深刻的感悟还有教训. 刚开始比赛选择了贩卖武器那道题,也是全场到最后唯一没有被人做出来的一道题,策略的严重错误,大 ...

  6. 河南省第七届ACM程序设计大赛总结

    省赛总结 首先说说比赛时的情况吧,刚开始的时候我的任务就是翻译英文题目,找出比较水的题目,他们两个直接找中文水题切,其实每次比赛我们都是这样配合的,由于他们的判题系统一开始存在问题,交的正确的代码给判 ...

  7. 河南省第七届ACM程序设计大赛赛后总结

    我们学校ACM集训开始于4月5号(清明节),5月25日在郑州解放军信息工程大学举办,集训耗时50天,但是感觉效果还行,但是也不是太好:我们也已经尽力了,虽然说只拿了个银牌,每份收获的背后,都会有辛勤的 ...

  8. ZZUOJ-1195-OS Job Scheduling(郑州大学第七届ACM大学生程序设计竞赛E题)

    1195: OS Job Scheduling Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 106  Solved: 35 [id=1195&quo ...

  9. poj 3666 河南省第七届程序设计D题(山区修路)

    题目大意: 给定一个序列,以最小代价将其变成单调不增或单调不减序列,求最小的变动价值:需要用到离散化dp 状态转移方程: dp[i][j]=abs(j-w[i])+min(dp[i-1][k]);(k ...

随机推荐

  1. 2019 蓝桥杯国赛 B 组模拟赛 题解

    标签 ok #include<bits/stdc++.h> using namespace std; /* 求阶乘 去除尾部0 每次求阶乘时:结果去除尾0,并对 1e6取余 */ type ...

  2. glibc-static

    yum install glibc-static yum install libstdc++-static

  3. 1、zabbix监控基础概念

    目录 为什么要使用监控? 监控怎么用? 去到一家新公司,应该如何搭建监控系统? 我叫张贺,贪财好色.一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛 ...

  4. python3.5.3rc1学习十一:字典与模块

    #os模块import oscurDir = os.getcwd()print(curDir) os.mkdir("新建") import timetime.sleep(2)os. ...

  5. 题解:swj社会摇基础第一课

    题目链接 思路:dp,f[i]表示构成i所需要的最小步数 //swj么么哒 #include<bits/stdc++.h> using namespace std; int n; cons ...

  6. Ajax常用例子 Post 和 Get

    1. 前台:Post$.ajax({ url: "@Url.Action("Save", "UserFun")", type: " ...

  7. Mondb

    1. MongoDB简介 • MongoDB是为快速开发互联网Web应用而设计的数据库系统.• MongoDB的设计目标是极简.灵活.作为Web应用栈的一部分.• MongoDB的数据模型是面向文档的 ...

  8. A1044 Shopping in Mars (25 分)

    一.技术总结 可以开始把每个数都直接相加当前这个位置的存放所有数之前相加的结果,这样就是递增的了,把i,j位置数相减就是他们之间数的和. 需要写一个函数用于查找之间的值,如果有就放返回大于等于这个数的 ...

  9. 9.29 csp-s模拟测试55 联+赛+题

    T1 联 $n$最大到$1e18$,根本没法做,但$m$只有$1e5$,发现有很多区间是一起动的,或者根本没动,所以可以把区间离散化掉,然后线段树区间修改,对于第三种修改,只需要把它分解成一段一段相同 ...

  10. github上计算String相似度好的项目

    项目中包含了杰卡德NGram.cosin夹角.最长公共子序列.边际距离等常用的相似度算法. https://github.com/tdebatty/java-string-similarity