2019CCPC江苏南京女生赛 | 题解

ACM竞赛解题总结
本文总结了在ACM竞赛中解决的多个问题,包括签到题、数学题、暴力模拟、推公式等类型,详细介绍了每道题的解题思路和代码实现,特别关注于算法设计与编程技巧。

比赛网址:http://acm.hdu.edu.cn/contests/contest_show.php?cid=866

交题需要找到对应题号交题

(啊 比赛过去两个月了 都快不记得了 还好保留了做题的痕迹emm

开坑了

现场赛的时候没做几个题

现在补一下

 

A.Ticket

HDU 6544  签到题

大白做的

就是模拟一下就行了

注意输出是保留两位小数

刚写的新鲜热乎的代码如下

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<bits/stdc++.h>
using namespace std;
double a[1005];
int main()
{
    int t;
    double sum=0;
    scanf("%d",&t);
    for (int i=0;i<t;i++)
    {
        scanf("%lf",&a[i]);
        if (sum<100)
            sum+=a[i];
        else if (sum<150)
            sum +=a[i]*0.8;
        else if (sum<400)
            sum+=a[i]*0.5;
        else
            sum+=a[i];
    }
    printf("%.2lf\n",sum);
    return 0;
}

 

G.Circle

HDU 6550 数学题

大白做的

 

 

 

K.Tetris

HDU 6554 暴力模拟

大白和Alone做的

 

 

J.Tangram

HDU 6553  推公式(找规律)

我做的

与杭电某道题很类似

提出假设并验证emmm就好了

证明

 

代码​​​​​​​如下:

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n;
    while (~scanf("%lld",&n))
    {
        long long sum =7+(6+n+5)*n/2;
        printf("%lld\n",sum);
    }
    return 0;
}

补题的时候居然没意识到用long long 还WA了一次

没有比赛时候仔细啊 TAT

 

B.Gcd

HDU 6545 素数筛+分类讨论

我和Alone一起做的

有两次罚时

第一次是因为考虑问题不全面

第二次是因为没用板子 然后超时了

 

 

 

 

接下来是比赛中没做出的题目

H.Clock

HDU 6551 暴力+讨论

 

C.Function

HDU 6546 

 

 

 

 

 

 

 

 

 

 

 

 

待补题

……

2021年CCPC女生程序设计竞部分题解如下: - **A题公交路线题解**: ```cpp #include <bits/stdc++.h> using namespace std; int main() { int n, x, y, arr[15]={0}; cin >> n >> x >> y; for (int i = 1; i <= n; i++) { cin >> arr[i]; } int m, xx, brr[15]={0}; cin >> m; if(x<y){ for(int i=1;i<=m;i++){ cin>>brr[i]; if(brr[i]!=arr[i+x]){ cout<<"Wrong"<<endl; return 0; } } if(x-1<1||x-m<1){ cout<<"Right"<<endl; return 0; } for(int i=1;i<=m;i++){ if(arr[x-i]!=brr[i]){ cout<<"Right"<<endl; return 0; } } cout<<"Unsure"<<endl; return 0; }else{ for(int i=1;i<=m;i++){ cin>>brr[i]; if(brr[i]!=arr[x-i]){ cout<<"Wrong"<<endl; return 0; } } if(x==n||x+m>n){ cout<<"Right"<<endl; return 0; } for(int i=1;i<=m;i++){ if(arr[x+i]!=brr[i]){ cout<<"Wrong"<<endl; return 0; } } cout<<"Unsure"<<endl; } return 0; } ``` - **C题题解**: 思路是寻找一个最短的 `t`,使得 `t` 不是 `s(l,r)` 的子序列,假设现在位于 `x`,下一步有 `m` 个选择,要使子序列尽可能小,就选择离 `x` 最远的那个字母,直到走出 `r` 为止。问题转化为从 `l` 开始沿着 `_next` 一路往右跳,要跳多少步才能跳到 `> r` 的地方,使用倍增的方法使得 `_next[i][j]` 是 `i` 从 `2^j` 步到达的最远位置。 ```cpp #include<bits/stdc++.h> using namespace std; char s[200100]; int _next[200100][26];//st表 int v[2000100]; int a[26]; int main(){ int m,n; scanf("%d%d",&m,&n); scanf("%s",s+1); for(int i=0;i<=25;i++){ a[i]=n+1; } for(int i=n;i>=0;i--){ for(int j=0;j<m;j++){ v[i]=max(v[i],a[j]); } _next[i][0]=v[i]; if(i)a[s[i]-'a']=i; } for(int j = 1; j < 20; j ++){ for(int i = 0; i <= n; i ++) { int t = _next[i][j - 1]; if(t <= n) _next[i][j] = _next[t][j - 1]; else _next[i][j] = n + 1; } } int q; scanf("%d",&q); while(q--){ int l,r; scanf("%d%d",&l,&r); int ans = 0, now = l - 1; for(int j = 19; ~j; j --) if(_next[now][j] <= r) ans += (1 << j), now = _next[now][j]; printf("%d\n",ans+1); } return 0; } ``` 以上代码分别对应2021年CCPC女生程序设计竞A题和C题的题解 [^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值