每天一套题打卡|河南省第七届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当然也可以
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;
} 

原文地址:https://www.cnblogs.com/fisherss/p/10802773.html

时间: 2024-11-08 19:22:05

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

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

我们学校ACM集训开始于4月5号(清明节),5月25日在郑州解放军信息工程大学举办,集训耗时50天,但是感觉效果还行,但是也不是太好:我们也已经尽力了,虽然说只拿了个银牌,每份收获的背后,都会有辛勤的汗水,毕竟我们也努力了: 下面说说比赛中的问题:觉得吧,虽说模拟赛参加了很多,但是到了正式的比赛的时候,还是出现了紧张的情况,九点开始比赛,我们AC第一道题的时间是在十点半左右,题目不难而且曾经也做过啊,但是就是调试不好,越调试不好,心里就越急啊:刚开始看题的时间,我们都看了第一道题,意思也都明白,

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

虽然大赛已经结束了两天,不过比赛的场景还是不断地在眼前回放,一遍遍,这次的比赛给了我很深刻的感悟还有教训. 刚开始比赛选择了贩卖武器那道题,也是全场到最后唯一没有被人做出来的一道题,策略的严重错误,大概耽误了1个多小时. 后面发现了此题的难度,于是换了一道题简单题,不过由于测试数据多了一个空格,一直超时,此刻已经受到了比较大的打击,并且心神开始乱了起来,以至于做第二题的时候 一直明白怎么写,却错了好多次,不能静心分析细节,不过后来由于队友的鼓励重新冷静了下来,情况才得以好转,这使我发现了自己的不

河南省第七届ACM大赛成绩

本来不想写这篇文章了,但后来想想还是写了:一为纪念我第一次参加这样一个规模宏大的赛事,二为激励自己争取在明年ACM赛场上取得更好地成绩! 注:考试过程不再详细描述! 队名:逐鹿 队员组成: 队长:许长安 队员:李朋飞   张亚威 队员分工: 统筹:许长安 主力:张亚威 翻译:李朋飞 本次比赛,和队长许长安.队友李朋飞在考场配合比较默契,顺利解决了4道题,以30名的成绩取得银奖! 河南省第七届ACM程序设计大赛最终排名 河南省第六届ACM程序设计大赛最终排名 河南省第七届ACM大赛成绩

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

A 表达式求值 表达式求值:可以用递归求解,也可以用栈模拟,考过多次. 类似题目:NYOJ305,NYOJ35 用栈模拟做法: #include <stdio.h> #include <string.h> #include <stack> using namespace std; stack<int> dsta;//数据栈 stack<char> osta;//字符栈 char s[1005]; int main() { int T,i,j; s

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

1195: OS Job Scheduling Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 106  Solved: 35 [Submit][Status][Web Board] Description OS(Operating System) is to help user solve the problem, such as run job(task).A multitasking OS is one that can simultaneo

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

1195: OS Job Scheduling Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 106  Solved: 35 [Submit][Status][Web Board] Description OS(Operating System) is to help user solve the problem, such as run job(task).A multitasking OS is one that can simultaneo

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

题目大意: 给定一个序列,以最小代价将其变成单调不增或单调不减序列,求最小的变动价值:需要用到离散化dp 状态转移方程: dp[i][j]=abs(j-w[i])+min(dp[i-1][k]);(k<=j)这里的k无需从1遍历到j. 只要在对j进行for循环的时候不断更新一个dp[i-1][j]的最小值mn=min(mn,dp[i-1][j]), 然后对dp[i][j]=abs(j-w[i])+mn即可; 1 #include<algorithm> 2 #include<iost

山东省第七届ACM竞赛 J题 Execution of Paladin (题意啊)

题意:鱼人是炉石里的一支强大种族,在探险者协会里,圣骑士有了一张新牌,叫亡者归来,效果是召唤本轮游戏中7个已死鱼人.如果死掉的不足7个,那么召唤的数量就会不足7. 鱼人有很多,下面的4个是: 寒光智者:3费,2攻,2血,战吼:双方玩家各抽2张牌. 鱼人领军:3费,3攻,3血,其他鱼人获得+2/+1. 蓝腮战士:2费,2攻,3血,冲锋. 老瞎眼:4费,2攻,3血,冲锋.战场上每有1个其他鱼人就会使其获得+1攻击. 下面给一些说明: 法力:召唤随从的消耗.技能效果召唤的随从不消耗额外法力,只会消耗卡

hdu 4435 第37届ACM/ICPC天津现场赛E题

转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出N个城市,从1开始需要遍历所有点,选择一些点建立加油站,使得花费最少 这题的特殊性在于他的花费上,2^(i-1) 利用一个非常重要的性质,2^0+2^1+2^2……+2^i<2^(i+1) 所有编号<=i的所有点都建,总花费比建一个还少. 这里就贪心一下,先假设所有点都建,然后依次从编号大的删点,看看能不能遍历整个图 dist[i]表示