时间限制 1 Second  内存限制  512 Mb

题目描述

给个字符串s和整数k.(字符串中只有0-9)

问至少修改字符串中的几位才可以让字符串的各个位之和大于等于k.

输入

第一行一个整数T表示有T组测试数据 (1 ≤ T ≤ 10)

接下来每组测试数据:

第一行给定一个整数k.

第二行给定字符串s. (1 ≤ strlen(s), k ≤ 1e5)

输出

每组数据输出一行表示最小的修改次数,如果无法满足题意请输出-1.

输入样例

2

5

13

100

123

输出样例

1

-1

思路

这个题的Tag是贪心,但是感觉和贪心没什么关系(可能是我对贪心的理解不够)

思路就是先求出来字符串的长度L,计算字符串所有的字符更改后能达到的最大值(也就是9*L)与k进行比较,如果小于k,那么一定无法达到要求,输出-1

如果大于k,将字符串的各位换成整型存起来,并计算各位数字相加的总和,如果大于k,那么输出0 ,如果小于k,将整型数升序排序,从第一位开始更改(因为题意要求输出最小的修改次数,所以要把小的数变成最大的才能使每一次修改后的总和增加的最大,升序排序会更容易操作一些),记录下来更改的次数输出就可以了

其实上面的这些过程都可以在一起进行(标程也是这样写的),但是用的时间稍微多了一点

AC代码

我自己写的

/**
* Time: 1ms Memory: 3MB Lang: C++ Author: wzy
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ull unsigned long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x7f7f7f7f
#define lson o<<1
#define rson o<<1|1
const double E=exp(1);
const int maxn=1e6+10;
const int mod=1e9+7;
using namespace std;
char ch[maxn];
int a[maxn];
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int t;
int k;
cin>>t;
while(t--)
{
cin>>k;
cin>>ch;
int l=strlen(ch);
if(9*l<k)
{
cout<<-1<<endl;
continue;
}
int res=0;
for(int i=0;i<l;i++)
{
a[i]=ch[i]-'0';
res+=a[i];
}
if(res>=k)
{
cout<<0<<endl;
continue;
}
sort(a,a+l);//升序
int ans=0;
for(int i=0;i<l;i++)
{
if(a[i]==9)
continue;
res=res+9-a[i];
ans++;
if(res>=k)
{
cout<<ans<<endl;
break;
}
}
}
return 0;
}

标程

/**
* Time: 2ms Memory: 3MB Lang: C++
*/
#include <bits/stdc++.h> using namespace std;
#define ll long long
ll k, g, ans;
string s; int main() { //freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T; cin>>T;
while(T--) {
ans=0,g=0;
s.clear();
cin >> k;
cin >> s;
for (int i = 0; i < s.length(); i++)
g += s[i] - '0';
sort(s.begin(), s.end());
for (int i = 0; i < s.length(); i++) {
if(s[i] == '9') break;
if (g < k) {
g += 9 - s[i] + '0';
ans++;
}
}
if(g<k) cout<< -1<<endl;
else cout << ans << endl; }
return 0;
}

HPU组队赛L(没有标题。。)(贪心)的更多相关文章

  1. 集训第四周(高效算法设计)L题 (背包贪心)

    Description   John Doe is a famous DJ and, therefore, has the problem of optimizing the placement of ...

  2. upc组队赛3 T-net【贪心】

    T-net 题目描述 T-net which is a new telecommunications company, plans to install its base stations in th ...

  3. HPU组队赛J:Ball King(线段树)

    时间限制 1 Second  内存限制 512 Mb 题目描述 HPU601球王争霸赛即将举行,ACMER纷纷参加. 现在有n个人报名参赛,每个人都有一个实力值 ai,实力值较大者获胜. 为保证比赛公 ...

  4. HPU组队赛B:问题(二进制枚举)

    时间限制1 Second 内存限制 512 Mb 题目描述 你有n个问题,你已经估计了第i个问题的难度为Ci,现在你想使用这些问题去构造一个问题集.比赛的问题集必须包含至少两个问题,而且比赛的总难度必 ...

  5. upc 组队赛18 STRENGTH【贪心模拟】

    STRENGTH 题目链接 题目描述 Strength gives you the confidence within yourself to overcome any fears, challeng ...

  6. L 裁纸片 贪心 + 模拟

    https://biancheng.love/contest-ng/index.html#/123/problems 如果只是输出最小的值,那么好办,a升序,b降序,这样是最优的. 但是需要次数,这就 ...

  7. Liebig's Barrels CodeForces - 985C (贪心)

    链接 大意:给定$nk$块木板, 要制作$n$个$k$块板的桶, 要求任意两桶容积差不超过$l$, 每个桶的容积为最短木板长, 输出$n$个桶的最大容积和 假设最短板长$m$, 显然最后桶的体积都在$ ...

  8. NOIP模拟 poke - 贪心

    题目大意: 给一副牌(\(n \le 1000000, a_i \le 1000000\)),问最多能打出多少对对子(x, x)或者顺子(x, x + 1, x + 2). 题目分析: 感觉跟斗地主很 ...

  9. 马克飞象 Markdown 使用和学习

    第三方学习网站 http://sspai.com/25137https://maxiang.io/ 使用工具:有道云笔记 https://note.youdao.com/ 新建时使用Mardown类型 ...

随机推荐

  1. 文件操作_26th,Nov 2018

    文件:操作系统问应用程序或用户提供一种操作硬盘的虚拟单位 --文件时操作系统提供的虚拟单位 --应用程序或用户对文件的读写操作都是向操作系统发送指令 --文件包括文本文件和二进制文件 为何要用文件:文 ...

  2. 解决eclipse/myeclipse导入项目时出现红色叹号的方法

  3. bzoj1717

    题解: 二分答案 然后hash 代码: #include<bits/stdc++.h> using namespace std; ,P2=,P=; int a1[P],num[P],a2[ ...

  4. Python3 线程/进程池 concurrent.futures

    python3之concurrent.futures一个多线程多进程的直接对接模块,python3.2有线程池了 Python标准库为我们提供了threading和multiprocessing模块编 ...

  5. 稀疏 部分 Checkout

    To easily select only the items you want for the checkout and force the resulting working copy to ke ...

  6. linux 基础储备

    ls命令是Linux下最常用的命令之一,ls跟dos下的dir命令是一样的都是用来列出目录下的文件,下面我们就来一起看看ls的用法ls /home 这个命令不但可以添加用户到系统,而且可以默认为新用户 ...

  7. 查看json数据更新情况

    #! python3 # -*- coding:utf8 -*- #主要为读取excel中接口地址,打开网页爬取url页面中数据,解析json,检查是否符合逻辑(正常) import requests ...

  8. pytorch加载和保存模型

    在模型完成训练后,我们需要将训练好的模型保存为一个文件供测试使用,或者因为一些原因我们需要继续之前的状态训练之前保存的模型,那么如何在PyTorch中保存和恢复模型呢? 方法一(推荐): 第一种方法也 ...

  9. Cracking The Coding Interview 1.4

    //Write a method to decide if two strings are anagrams or not. // // 变位词(anagrams)指的是组成两个单词的字符相同,但位置 ...

  10. 2.5 C++类class和结构体struct区别

    参考:http://www.weixueyuan.net/view/6337.html 总结: 在C++中,struct类似于class,在其中既可以定义数据成员,又可以定义成员函数. 在C++中,s ...