T1

题目描述

安娜斯塔西娅喜欢去乌日扬迪安中央公园散步。 但她对简单的散步不感兴趣,于是她开始收集公园里的鹅卵石。 一开始,她决定收集所有她能在公园里找到的鹅卵石。

她只有两个口袋。 她能在每个口袋里同时放最多k个鹅卵石。第i种鹅卵石有w[i]个。 安娜斯塔西娅很有责任感,所以她从不把不同类型的鹅卵石混在一个口袋里。 然而,她可以把不同种类的鹅卵石放在不同的口袋。 不幸的是,她不能把所有的时间都花在收集鹅卵石上,所以她每天只能从公园里收集一次鹅卵石。

考虑到安娜斯塔西娅不能把不同类型的鹅卵石放在同一个口袋里,请帮助她找到收集乌日扬甸中央公园所有鹅卵石所需的最短天数。

解法:直接模拟

#include <cstdio>
#define ll long long inline ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} int main(){
int n = read(), k = read(), a;
ll tot = ;
for (int i = ; i < n; ++i)
a = read(), tot += (a % k) ? (a / k + ) : (a / k);
tot = (tot & ) ? ((tot >> ) + ) : (tot >> );
printf("%lld", tot);
return ;
}

T2

题意:给你一个等比数列,首项为b1,公比为q,现在Masha在黑板上从首项开始书写这个等比数列,直到数列某项的绝对值大于l,给定m个整数,若该等比数列中的某项等同于这m个整数,则不会被写出。
问Masha会写出多少个数字?如果她会写出无穷多个数字,输出inf
注意: b1,q可能为0

解法:

特判q为0,1,-1;b1为0的情况
然后其他情况直接用set暴力模拟即可
有一个坑点:
----如果abs(b) > l即使q=0,0没有限制也要输出0,蒟蒻不知道为什么

#include <cstdio>
#include <cmath>
#include <set>
#define ll long long using namespace std; inline ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} set<ll> st; int main(){
ll b = read(), q = read(), l = read(), m = read();
for (int i = ; i <= m; ++i)
st.insert(read());
if (q == ){
if (st.find() != st.end() || (l < )){
if (st.find(b) != st.end() || (abs(b) > l))
printf("");
else
printf("");
}
else if (abs(b) > l)
printf("");
else
printf("inf");
return ;
}
else if (q == ){
if ((abs(b) > l) || st.find(b) != st.end())
printf("");
else
printf("inf");
return ;
}
else if (q == -){
if (abs(b) > l){
printf("");
return ;
}
if (st.find(b) == st.end()){
printf("inf");
return ;
}
if (st.find(-b) == st.end()){
printf("inf");
return ;
}
printf("");
return ;
}
else if (b == ){
if (st.find() != st.end() || (l < ))
printf("");
else
printf("inf");
return ;
}
else{
int cnt = ;
for (ll i = b; abs(i) <= l; i *= q){
if (st.find(i) == st.end())
++cnt;
}
printf("%d", cnt);
}
return ;
}

T3

题意:

定义一个函数,函数如下(请找个markdown编辑器贴一下):

$f[l,r]=\sum_{i=l}^{r-1}|a_i-a_{i-1}|\times(-1)^{i-l}$

|x|表示x的绝对值。
现在给你一个函数,请取恰当的l,r使f值最大,请输出最大的f值

解法:不说了直接DP

#include <cstdio>
#include <cmath>
#include <algorithm>
#define max(a,b) ((a>b)?a:b)
#define ll long long using namespace std; inline ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} int a[];
ll f[][]; int main(){
int n = read();
for (int i = ; i <= n; ++i)
a[i] = read();
for (int i = ; i < n; ++i)
a[i] = abs(a[i] - a[i + ]);
ll ans = a[];
f[][] = a[], f[][] = ;
for (int i = ; i < n; ++i){
if (i & ){
f[i][] = max(f[i - ][] + a[i], a[i]);
f[i][] = f[i - ][] - a[i];
}
else{
f[i][] = max(f[i - ][] + a[i], a[i]);
f[i][] = f[i - ][] - a[i];
}
ans = max(max(f[i][], f[i][]), ans);
}
printf("%lld", ans);
return ;
}

T4

题意:总共有n个节点,m条路径,要求其中m-2条路径走两遍,剩下2条路径仅走一遍,问不同的路径总数有多少,如果仅走一遍的两条边不同则将这两条路径视为不同。

解法:DFS判图的联通性+数学

#include <cstdio>
#define ll long long struct Edge{
int to, next;
} edges[]; int head[], edge_num = ;
int cnt[]; inline ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} inline void addEdge(int from, int to){
++cnt[from];
edges[++edge_num] = (Edge){to, head[from]};
head[from] = edge_num;
} bool vis[];
int rd[]; void DFS(int u){
for(int c_e = head[u]; c_e; c_e = edges[c_e].next){
int v = edges[c_e].to;
if(!vis[v]){
vis[v] = ;
DFS(v);
}
}
} inline ll cac(ll num){
return (((num - ) * num) >> );
} int main(){
int n = read(), m = read();
ll zh = ;
for(int i = ; i <= m; i++){
int u = read(), v = read();
++rd[u], ++rd[v];
if(u != v)
addEdge(u, v), addEdge(v, u);
else
++zh;
}
for(int i = ; i <= n; ++i)
if(head[i] != ){
vis[i] = , DFS(i);
break;
}
ll ans = ;
for(int i = ; i <= n; ++i)
if(!vis[i] && rd[i]){
printf("");
return ;
}
for(int i = ; i <= n; ++i)
ans += 1ll * cac(cnt[i]);
ans += zh * (m - ) - cac(zh);
printf("%lld", ans);
return ;
}

T5

题意:有k种可乐,第i瓶可乐的CO2浓度是ai/1000,问要配置出浓度n/1000的可乐,最少需要几瓶可乐。

解法:题目very interestring但其实就是个广搜

#include <cstdio>
#include <algorithm>
#include <queue>
#define ll long long using namespace std; int a[];
int ans[];
bool vis[]; inline ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} queue<int> que; int main(){
int n = read(), k = read();
for(int i = ; i < k; ++i)
a[i] = read() - n;
sort(a, a + k);
k = unique(a, a + k) - a;
if(a[] * a[k - ] > ){
printf("-1\n");
return ;
}
for(int i = ; i < k; ++i){
que.push(a[i]);
ans[a[i] + ] = , vis[a[i] + ] = ;
}
int u;
while(!que.empty() && !vis[]){
u = que.front(), que.pop();
for(int i = ; i < k; ++i){
if((u + a[i]) <= && (u + a[i]) >= - && !vis[u + a[i] + ]){
que.push(u + a[i]);
vis[u + a[i] + ] = ;
ans[u + a[i] + ] = ans[u + ] + ;
}
}
}
printf("%d", ans[]);
return ;
}

[HG]奋斗赛G的更多相关文章

  1. HG奋斗赛B[20190429]

    T1 >传送门< 记忆化搜索,听说有更简单的方法(但博主比较菜) #include <cstdio> #include <cstdlib> #define ll l ...

  2. HG奋斗赛A[20190428]

    T1 很简单,判断这个字符串有多少个不同的字符,让后用k减一减 注意: 1.如果不同字符数大于k,不要输出负数 2.变量名别打错 上代码 #include <cstdio> #includ ...

  3. [HG]奋斗赛M

    题A     请进入链接↑ 题B     请进入链接↑ 题C     请进入链接↑ 题D     请进入链接↑ 题E     请进入链接↑ 题F     懒得写了,借用一下Chtholly_Tree巨 ...

  4. 2016湖南省赛----G - Parenthesis (括号匹配)

    2016湖南省赛----G - Parenthesis (括号匹配)   Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of lengt ...

  5. 2016年省赛 G Triple Nim

    2016年省赛 G Triple Nimnim游戏,要求开始局面为先手必败,也就是异或和为0.如果n为奇数,二进制下最后一位只有两种可能1,1,1和1,0,0,显然异或和为1,所以方案数为0如果n为偶 ...

  6. 2020安徽程序设计省赛 G序列游戏

    2020安徽程序设计省赛 G序列游戏 有一个序列w,初始为空.再给出一个长度为m 单调递增的序列a.你需要对序列w 作如下n 次操作: (1)操作0,在序列尾部添加数字0. (2)操作1,在序列尾部添 ...

  7. 第八届河南省赛G.Interference Signal(dp)

    G.Interference Signal Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 35  Solved: 17 [Submit][Status ...

  8. 第七届河南省赛G.Code the Tree(拓扑排序+模拟)

    G.Code the Tree Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 35  Solved: 18 [Submit][Status][Web ...

  9. 2016年省赛G题, Parenthesis

    Problem G: Parenthesis Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 398  Solved: 75[Submit][Status ...

随机推荐

  1. Delphi XE2 之 FireMonkey 入门(25) - 数据绑定: TBindingsList: 表达式的灵活性及表达式函数

    Delphi XE2 之 FireMonkey 入门(25) - 数据绑定: TBindingsList: 表达式的灵活性及表达式函数 绑定表达式中可以有简单的运算和字符串连接, 但字符串需放在双引号 ...

  2. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_4_字节输出流写入数据到文件

    数据由内存写入到硬盘中 构造函数传的路径是一个相对路径.有异常需要捕获异常 释放资源 这三个方法,都有异常 IO异常是父类,所以这里只需要抛出IO异常就可以了. 运行程序.目录内多了个a.txt文件 ...

  3. 多线程threading初识,线程等待

    1.线程是程序里面最小的执行单元. 2.进程是资源的集合. 线程是包含在进程里面的,一个进程可以有多个线程,但只要要有一个线程. 一.多线程,就是N个线程一起干活: 1.传统方式,串行,循环5次需要1 ...

  4. 将字符串映射为Delphi控件名,批量修改控件属性

    http://blog.sina.com.cn/s/blog_4dfbd07c01000a81.html 将字符串映射为Delphi控件名,批量修改控件属性 (2007-10-08 14:50:51) ...

  5. C#怎么让字符串定长,不够的用空格补齐

    string.PadLeft 或者 string.PadRight  : string.PadLeft 表示如果一个字符串的长度小于指定的值,则在字符串的左侧(也就是前面)用指定的字符填充,直到字符串 ...

  6. 前端借助接口获取ip地址

    <script language="javascript" src="http://www.codefans.net/ajaxjs/jquery1.3.2.js&q ...

  7. 树莓派3b折腾指南

    最近入手了树梅派3b,搭建了宿舍共享的热点和NAS,搭建透明代理科学上网的计划还没实现. 先报个价,一套折腾下来花了500大洋,树梅派3加外壳200,电源加内存卡100,显示器淘宝二手150,有线键鼠 ...

  8. VC调试方法大全

    VC调试方法大全 一.调试基础 调试快捷键 F5:  开始调试 Shift+F5: 停止调试 F10:   调试到下一句,这里是单步跟踪 F11:   调试到下一句,跟进函数内部 Shift+F11: ...

  9. hive DML操作

    1.数据导入 1)向表中装载数据(load) 语法 hive> load data [local] inpath '/opt/module/datas/student.txt' [overwri ...

  10. 关于toString()和valueOf()以及Object.prototype.toString.call()的结合理解

    一.先说说String(): String()是全局函数,把对象的值转换为字符串. 语法:String(obj); 任何值(对象)都有String()方法,执行过程是这样的:首先,如果该对象上有toS ...