每天一套题打卡|河南省第七届ACM/ICPC
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的更多相关文章
- 每天一套题打卡|河南省第十届ACM/ICPC
A.谍报分析 题意:请你编程,快速统计出频率高的前十个单词. 思路:字符串输入,map哈希表map<string,int >记录每个单词出现的次数,pair重载优先级 #include&l ...
- 每天一套题打卡|河南省第十一届ACM/ICPC
A 计划日 题意:已知李明在YYYY年MM月DD日星期W订了学习计划,现在想看看李明N天后的完成情况和个人总结,你能告诉我那天的日期和星期几吗? 模拟日期计算: 计算星期可以用基姆拉尔森公式 //中国 ...
- 每天一套题打卡|河南省第八届ACM/ICPC
A 挑战密室 化学方程式求分子量 这题我懒得写了 可以用map<string,int>哈希表,表示每种分子的相对分子质量 之后,从头遍历到尾. 1.数字:连读直到不是数字 2.字母:连读直 ...
- 每天一套题打卡|河南省第九届ACM/ICPC
A 表达式求值 表达式求值:可以用递归求解,也可以用栈模拟,考过多次. 类似题目:NYOJ305,NYOJ35 用栈模拟做法: #include <stdio.h> #include &l ...
- 2014年河南省第七届ACM大赛总结
虽然大赛已经结束了两天,不过比赛的场景还是不断地在眼前回放,一遍遍,这次的比赛给了我很深刻的感悟还有教训. 刚开始比赛选择了贩卖武器那道题,也是全场到最后唯一没有被人做出来的一道题,策略的严重错误,大 ...
- 河南省第七届ACM程序设计大赛总结
省赛总结 首先说说比赛时的情况吧,刚开始的时候我的任务就是翻译英文题目,找出比较水的题目,他们两个直接找中文水题切,其实每次比赛我们都是这样配合的,由于他们的判题系统一开始存在问题,交的正确的代码给判 ...
- 河南省第七届ACM程序设计大赛赛后总结
我们学校ACM集训开始于4月5号(清明节),5月25日在郑州解放军信息工程大学举办,集训耗时50天,但是感觉效果还行,但是也不是太好:我们也已经尽力了,虽然说只拿了个银牌,每份收获的背后,都会有辛勤的 ...
- 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 ...
- poj 3666 河南省第七届程序设计D题(山区修路)
题目大意: 给定一个序列,以最小代价将其变成单调不增或单调不减序列,求最小的变动价值:需要用到离散化dp 状态转移方程: dp[i][j]=abs(j-w[i])+min(dp[i-1][k]);(k ...
随机推荐
- luoguP3258 [JLOI2014]松鼠的新家
树上差分 树上差分分析 使点x到点y的路径上(链上),全加上一个值,可以选择使用树上差分(不用线段树乱搞.... 首先,和普通的差分一样,要有一个tag.然而,对于一个结点,我们需要求出它全部儿子的t ...
- 19.8.2 luogu 夏令营 游
人生第一次游记....是在学校机房,在luogu网校,在炎炎夏日,在薯条汉堡,在自己的博客里... 十二天快吗? 刚上课那会真的比较兴奋,把每天的计划都排的满满的,希望这十二天慢点,再慢点,我得好好过 ...
- jmeter录制移动端脚本
jmeter录制脚本有两种方式,一种借助外部工具badbody,一种是本身的功能,使用代理服务器,介绍下如何使用代理服务器录制脚本.我一般在测app或者移动端H5页面时才会录制,所以此文也针对移动端. ...
- Log日志级别从高到低排序 ERROR、WARN、INFO、DEBUG
Log4j建议只使用四个级别,优先级从高到低分别是 ERROR.WARN.INFO.DEBUG.通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关.比如在这里定义了INFO级别,则应 ...
- NOIP 2011 计算系数
洛谷 P1313 计算系数 洛谷传送门 JDOJ 1747: [NOIP2011]计算系数 D2 T1 JDOJ传送门 Description 给定一个多项式(ax + by)k,请求出多项式展开后x ...
- CF-1238 C.Standard Free2play
题目大意: 有一个墙,高度为h,在每一个高度处都有一个踏板,有的踏板是隐藏着的,有的是伸出来的,小人站在h高度处(题目保证h高度处的踏板一定是伸出来的),这个小人每站到一个踏板上,就可以点一个开关,将 ...
- linux的命令操作
linux的命令操作 1.日常操作命令 **查看当前所在的工作目录pwd **查看当前系统的时间 date **查看有谁在线(哪些人登陆到了服务器)who 查看当前在线last 查看最近的登陆历史记录 ...
- IPv6 邻居状态迁移
- LeetCode 283:移动零 Move Zeroes
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. Given an array nums, write a function to move all 0' ...
- MySQL性能诊断与调优
LAMP 系统性能调优,第 3 部分: MySQL 服务器调优http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-3.html LoadRun ...