2024.3.14|华北水利水电大学江淮校区ACM社团训练赛
1.牛牛去购物
2.优美字符串
3.谜题:质数
4.华华给月月准备礼物
5.小红的数位删除
心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。
牛牛去购物
题目:
牛牛带着 n 元钱去超市买东西,超市一共只有两款商品,价格为 a 元的篮球和价格为 b 元的足球,牛牛想把手里的钱尽可能花光,请问牛牛最少能剩多少钱?
输入描述:
输入一行,三个正整数 n,a,b(1≤n,a,b≤1000),n 表示牛牛现有的钱数,a 表示一个篮球的单价,b 表示一个足球的单价。
输出描述:
输出一行一个整数,代表牛牛最少能剩下的钱数。
示例1
输入
7 5 3
输出
1
注意:
此题暴力枚举即可。
实践代码:
#define INF 0x3f3f3f3f//无穷大
void solve(){
int n,a,b;cin>>n>>a>>b;
int mn=INF;
for(int i=0;i<=1000;i++){
for(int j=0;j<=1000;j++){
if(a*i+b*j<=n) mn=min(mn,n-(a*i+b*j));
}
}
cout<<mn;
}
优美字符串
题目:
DD给了dd一个由小写英文字母组成的字符串,但是dd觉得这个串太丑,dd觉得一个优美的字符串应该满足任意相邻字符都不相等,她想知道把给定字符串变成一个优美的字符串最少需要插入多少个字符,你只要告诉她,插入最少字符后的串的长度
输入描述:
第一行一个数T(1≤T≤10)
接下来T行,每行一个有且仅有小写英文字母构成的字符串s(1≤|s|≤100000)
输出描述:
输出T行,每行一个数,表示美化后串的最短长度
示例1
输入
4
a
ab
abbc
aaabb
输出
1
2
5
8
说明:
样例解释
第一个第二个不用动
第三个可以改成ababc
第四个可以改成abababab
实践代码:
void solve(){
string s;cin>>s;
int cnt=0;
for(int i=0;i<s.length()-1;i++){
if(s[i]==s[i+1]) cnt++;
}
cout<<cnt+s.length()<<endl;
}
谜题:质数
题目:
给出一个质数 n,请求出一个质数 m,使得 n+m 不是质数。
其中,质数是指大于 1 的自然数,除了 1 和自身外,不能被其他自然数整除的数。
输入描述:
仅输入一行,包含一个整数 n(2≤n≤2⋅105 ),保证 n 是质数。
输出描述:
仅输出一行。包含一个质数 m(2≤m≤2⋅105 ),表示答案。
如果有多个可行的答案,请输出任意一个。
可以证明,在题目所给条件下一定有解。
示例1
输入
11
输出
3
bool isPrime(int x){//判断质数
for(int i=2;i<=x/i;i++){
if(x%i==0) return false;
}
return true;
}
void solve(){
int n;cin>>n;
for(int i=2;i<=n;i++){
if(!isPrime(n+i)) {cout<<i;break;}
}
}
华华给月月准备礼物
题目:
二月中旬虐狗节前夕,华华决定给月月准备一份礼物。为了搭建礼物的底座,华华需要若干根同样长的木棍。华华手头上有一些长度参差不齐的木棍,他想将每根都裁剪成若干段自己想要的长度,并丢掉多余的部分。因为华华的手很巧,所以他的裁剪过程不会有任何的失误。也就是说,对于一根长度为N的木棍,华华可以精准的将它们裁剪为若干段木棍,使它们的长度之和为N。
华华不知道裁剪成多长比较好,所以干脆越长越好。不过由于华华有点强迫症,所以他希望长度为非负整数。保证所有木棍的原长也是非负整数。那么请问华华最终得到的每根木棍多长呢?
输入描述:
第一行两个正整数N、K,表示木棍原本的根数和华华希望得到的木棍根数。
第二行N个正整数Li表示每根木棍的初始长度。
输出描述:
输出一行一个非负整数,表示华华最终得到的n根木棍的每根最大长度。
示例1
输入
5 10
4 4 4 5 3
输出
1
说明
如果长度为2,只能得到2+2+2+2+1=9根,不够;长度为1可以得到4+4+4+5+3=20根,足够。所以答案最大是1。
示例2
输入
5 3
1 2 3 4 5
输出
3
备注:
1≤ N ≤2×105,1≤ Li ≤109,1≤ K ≤109
注意:
二分即可。
实践代码:
int n,k;
vector<int> a(n);
bool check(int mid){
int cnt=0;
for(int i=0;i<n;i++){
cnt+=a[i]/mid;
}
return cnt>=k;
}
void solve(){
cin>>n>>k;
for(int i=0;i<n;i++) {int x;cin>>x;a.emplace_back(x);}
int l=0,r=INF;
while(l<r){
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
}
小红的数位删除
题目:
小红拿到了一个正整数,她希望删除该正整数的最后三位,你能帮帮她吗?
输入描述:
一个正整数1000≤n≤109
输出描述:
删除最后三位后形成的正整数。
示例1
输入
12345
输出
12
实践代码:
void solve(){
string s;cin>>s;
int n;cin>>n;
cout<<s.substr(0,s.length()-3);
}
心有猛虎,细嗅蔷薇。再见了朋友~