铅球杯https://www.luogu.com.cn/problem/B3911
题目描述
蓝边铅球组织了“铅球杯”数据标注大赛。为了实现 Au 大满贯的宏大征途,LeAuingZ 报名参加了比赛。
蓝边铅球给出了 �N 个 int 类型变量的名字及其值,并要求 LeAuingZ 对 �k 句话进行数据标注。每句话由大小写英文字母、空格、半角逗号、半角句号和
{
、}
组成。在{}
之间的,为 �N 个变量名中的一个,LeAuingZ 需要将每一句话中全部的{变量名}
替换为变量的值并输出。例如,有 �=3,�=4a=3,b=4,对于句子
We know a is {a}, b is {b}.
,替换后将得到We know a is 3, b is 4.
。LeAuingZ 觉得这个任务很无聊,决定编写一个程序来快速获得 Au。
输入格式
输入共 �+�+1N+k+1 行。
输入的第一行为两个整数 �,�N,k。
接下来 �N 行,每行一个小写英文字符串、一个整数,分别代表变量名和变量的值。
接下来 �k 行,每行一个需要标注的句子。
输出格式
输出 �k 行,每行一个标注好的句子。
输入输出样例
输入 #1复制
5 2
abc 1
a 2
b 3
c 4
d 5
We have {a} apples.
We {d}onot have pencils.输出 #1复制
We have 2 apples.
We 5onot have pencils.说明/提示
对于 20%20% 的测试数据,�=1k=1。
对于另外 30%30% 的测试数据,1≤�≤261≤N≤26,变量名长度均为 11。
对于 100%100% 的测试数据,1≤�≤50001≤N≤5000,1≤�≤201≤k≤20。变量名仅含英文小写字母,变量名长度不超过 2020,变量的值在 int 范围内,标注前句子长度不超过 5×1045×104,保证
{}
成对合法出现。每句话由大小写英文字母、空格、半角逗号、半角句号和{
、}
组成。
#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3finline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
} int n,m,p;
map<string,int>mp;
string s;signed main(){n=read(),m=read();for (int i=1 ; i<=n; ++i){cin>>s>>p;mp[s]=p;}for (int i=1 ; i<=m+1 ; ++i){getline(cin,s);if (i==1) continue;for (int j=0; j<s.size() ; ++j){if (s[j]!='{') cout<<s[j];else{string s1="";int k=j+1;j++;while (s[k]!='}'){s1+=s[k];k++;j++;}cout<<mp[s1];}}cout<<endl;}
}
进制转换https://www.luogu.com.cn/problem/B3849
题目描述
小美刚刚学习了十六进制,她觉得很有趣,想到是不是还有更大的进制呢?在十六进制中,用
A
表示 1010、F
表示 1515。如果扩展到用Z
表示 3535,岂不是可以表示 3636 进制数了嘛!所以,你需要帮助她写一个程序,完成十进制转 �R 进制(2≤�≤362≤R≤36)的工作。
输入格式
输入两行,第一行包含一个正整数 �N,第二行包含一个正整数 �R,保证 1≤�≤1061≤N≤106。
输出格式
输出一行,为 �N 的 �R 进制表示。
输入输出样例
输入 #1复制
123
25输出 #1复制
4N
#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3finline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
} int n,m,a[200],cnt;signed main(){n=read(),m=read();while (n>0){a[cnt]=n%m;n/=m;cnt++;}for (int i=cnt-1; i>=0 ; --i){if (a[i]>=10) cout<<char(65+a[i]-10);else cout<<a[i];}
}
硬币翻转https://www.luogu.com.cn/problem/P2708
题目描述
有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用 11 表示,背面朝上的用 00 表示。
现在要求从这行的第一个硬币开始,将从第一个硬币开始的前若干个硬币同时翻面,求如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?
输入格式
一个字符串,由 00 和 11 组成,表示硬币的初始状态。
输出格式
一个整数,表示要翻转的最少次数。
输入输出样例
输入 #1复制
10
输出 #1复制
2
说明/提示
样例解释
第 11 次翻转:把第一个硬币翻到反面,字符串为 0000;
第 22 次翻转:把第一、二个硬币一起翻到正面,字符串为 1111,翻转完成,输出 22。
数据范围
记 �n 表示硬币的总个数,
对于 20%20% 的数据,1≤�≤101≤n≤10;
对于 50%50% 的数据,1≤�≤1041≤n≤104;
对于 100%100% 的数据,1≤�≤1061≤n≤106。
#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3finline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
} string s;
int len,cnt;signed main(){cin>>s;len=s.size();for (int i=0; i<len-1 ; ++i)if (s[i]!=s[i+1]) cnt++;if (s[len-1] == '0') cnt++;cout<<cnt;
}
学生分组https://www.luogu.com.cn/problem/P1109
题目描述
有 �n 组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界 �R 和下界 � (�≤�)L (L≤R),每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使 �N 组学生的人数都在 [�,�][L,R] 中。
输入格式
第一行一个整数 �n,表示学生组数;
第二行 �n 个整数,表示每组的学生个数;
第三行两个整数 �,�L,R,表示下界和上界。
输出格式
一个数,表示最少的交换次数,如果不能满足题目条件输出 −1−1。
输入输出样例
输入 #1复制
2
10 20
10 15输出 #1复制
5
说明/提示
数据范围及约定
对于全部数据,保证 1≤�≤501≤n≤50。
#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3finline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
} int a[55],sum;signed main(){int n=read();for (int i=1;i<=n;++i){a[i]=read();sum+=a[i];}int l=read(),r=read();if (sum < l*n || sum>r*n){cout<<-1;return 0;}int l1=0,r1=0;for (int i=1;i<=n ; ++i){if (a[i] < l) l1+=l-a[i];if (a[i] > r) r1+=a[i] -r;}cout<<max(l1,r1);
}
A/B Problemhttps://www.luogu.com.cn/problem/P1480
题目描述
输入两个整数 �,�a,b,输出它们的商。
输入格式
两行,第一行是被除数,第二行是除数。
输出格式
一行,商的整数部分。
输入输出样例
输入 #1复制
10
2输出 #1复制
5
说明/提示
0≤�≤1050000≤a≤105000,1≤�≤1091≤b≤109。
#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3finline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
} char a[10000];
int c[10000],b,x;// 1515
// 15
// 101signed main(){cin>>a>>b;int len=strlen(a);for (int i=0; i<len ; ++i){a[i]-='0';}for (int i=0; i<len ; ++i){c[i]=(x*10 + a[i]) /b;x=(x*10 +a[i]) %b;}int l=0;while ( c[l]== 0 && l<len) l++;for (int i=l ; i<len ; ++i){cout<<c[i];}if (a[0]==0) cout<<0;
}
买礼物https://www.luogu.com.cn/problem/P1194
题目描述
又到了一年一度的明明生日了,明明想要买 �B 样东西,巧的是,这 �B 样东西价格都是 �A 元。
但是,商店老板说最近有促销活动,也就是:
如果你买了第 �I 样东西,再买第 �J 样,那么就可以只花 ��,�KI,J 元,更巧的是,��,�KI,J 竟然等于 ��,�KJ,I。
现在明明想知道,他最少要花多少钱。
输入格式
第一行两个整数,�,�A,B。
接下来 �B 行,每行 �B 个数,第 �I 行第 �J 个为 ��,�KI,J。
我们保证 ��,�=��,�KI,J=KJ,I 并且 ��,�=0KI,I=0。
特别的,如果 ��,�=0KI,J=0,那么表示这两样东西之间不会导致优惠。
注意 ��,�KI,J 可能大于 �A。
输出格式
一个整数,为最小要花的钱数。
输入输出样例
输入 #1复制
1 1
0输出 #1复制
1
输入 #2复制
3 3
0 2 4
2 0 2
4 2 0输出 #2复制
7
说明/提示
样例解释 22。
先买第 22 样东西,花费 33 元,接下来因为优惠,买 1,31,3 样都只要 22 元,共 77 元。
(同时满足多个“优惠”的时候,聪明的明明当然不会选择用 44 元买剩下那件,而选择用 22 元。)
数据规模
对于 30%30% 的数据,1≤�≤101≤B≤10。
对于 100%100% 的数据,1≤�≤500,0≤�,��,�≤10001≤B≤500,0≤A,KI,J≤1000。
2018.7.25新添数据一组
#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3finline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
} const int N=1e5+5;struct edge{int from;int to;int w;
}e[250008];bool cmp(const edge& a,const edge& b){return a.w<b.w;
}int a,b,tot,f[10000];int find(int x){return f[x]==x?x:f[x]=find(f[x]);
}void unionn(int i,int j){f[find(i)]=find(j);
}signed main(){a=read(),b=read();
// for (int i=1; i<=b; ++ i){
// e[++tot].from=0;
// e[tot].to=i;
// e[tot].w=a;
// }for (int i=1; i<=b; ++ i){for (int j=1; j<=b; ++ j){int m=read();if (m!=0){e[++tot].from=i;e[tot].to=j;e[tot].w=m;}}}sort(e+1,e+1+tot,cmp);int sum=0,cnt=0;for (int i=1;i<=b; ++i){f[i]=i;}for (int i=1; i<=tot; ++i){if (find(e[i].from) != find(e[i].to)){unionn(e[i].from,e[i].to);sum+=e[i].w;cnt++;}if (cnt==b-1) break;}if (b==1) cout<<a;else cout<<sum+a;
}