大水场,除夕夜有点迷糊,大好的上分机会错过了。。。
A. Div. 7
更改给定的数字把它变成7的倍数,改变最少个数字并将它输出,如果本身就是7的倍数直接输出。
太莽了,上去就贡献罚时。如果不是7的倍数直接改变个位数字就行,但是要判断,不管是减去7的余数还是先加7在减余数,都不能动下一个数字。
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
int t,n,i,j;
cin>>t;
while(t--)
{
cin>>n;
if(n%7==0) {cout<<n<<endl;continue;}
else{
int k=n%7;
int u=n%10;
if(u-k<0) n=n+7-k;
if(u-k>=0) n=n-k;
cout<<n<<endl;
continue;
}
}
}
B. Minority
给定一个字符串(其中只包含0和1),截取其中一个子串,将其中0和1中比较少的数字删去,输出最多能删去的数量。
直接取整个字符串就行了,如果0和1的个数相等那答案就-1。
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
int t,n,i,j;
cin>>t;
while(t--)
{
string s;
cin>>s;
map<int,int>a;
int ans=0;
for(i=0;i<s.size();i++)
{
a[s[i]-'0']++;
ans=min(a[0],a[1]);
}
if(a[0]==a[1]) ans=ans-1;
cout<<ans<<endl;
}
}
C. Kill the Monster
Monocarp要杀怪兽,给出主人公的生命值和攻击力、怪物的生命值和攻击力。Monocarp有k枚硬币,每枚硬币可以提高w攻击力或者a生命值,主人公先动手,如果能先杀死怪兽则输出yes,反之则no。
麻烦题做多了,贪了半天心,结果就是个暴力,暴力举出所有硬币方案,只要能杀死怪兽则直接yes,如果所有方案都杀不死怪兽那么就是no。
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
ll t,n,i,j;
cin>>t;
while(t--)
{
ll hc,dc,hm,dm,k,a,w;
cin>>hc>>dc>>hm>>dm;
cin>>k>>w>>a;
int f=0;
for(i=0;i<=k;i++)
{
hc=hc+i*a;
dc=dc+w*(k-i);
ll wo=hm/dc;
if(hm%dc>0) wo=wo+1;
ll ta=hc/dm;
if(hc%dm>0) ta=ta+1;
if(wo<=ta) {f=1;break;}
hc=hc-i*a; //把生命值和攻击力变回去
dc=dc-w*(k-i);
}
if(f==1) cout<<"YES"<<endl;
if(f==0) cout<<"NO"<<endl;
}
}
D. Make Them Equal
给出n种硬币和k次改变,每种硬币有bi的代价和ci的价值。ai固定为1,每次执行1次改变可以使ai变成ai+ai/x(x为任意整数)每次将ai变成bi可以得到ci的钱,输出用k次改变可以得到最多的ci。
BFS+背包dp,bi只有1000的范围。记录一下路径,用BFS打出bi范围的表,然后直接用滚动数组优化的01背包去进行硬币问题的操作。唯一要注意的是打出bi的表发现最大就是12,也就是说如果改变次数是硬币数量的12倍以上就可以直接取到所有的硬币,跳过就行,如果不加这个判断条件很有可能会超时。
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
int a[10000];
ll dp[12010];
ll t,n,k;
void bfs(int u)
{
queue<int>q;
q.push(u);
while(q.size()>0)
{
int start=q.front();
q.pop();
for(int i=1;i<=start;i++)
{
if(a[start+start/i]==0||a[start+start/i]>a[start]+1)
{
a[start+start/i]=a[start]+1;
if(start+start/i<=1000)
q.push(start+start/i);
}
}
}
}
void solve()
{
for(int i=1;i<=1000;i++)
{
cout<<a[i]<<endl;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
bfs(1);
// solve();
int i,j;
cin>>t;
while(t--)
{
cin>>n>>k;
vector<int>b(n),c(n);
ll ans=0;
for(i=0;i<n;i++)
{
cin>>b[i];
b[i]=a[b[i]];
}
for(i=0;i<n;i++)
{
cin>>c[i];
ans=ans+c[i];
}
memset(dp,0,sizeof(dp));
if(k>=12*n)
{
cout<<ans<<endl;continue;
}
for(i=0;i<n;i++)
{
for(j=k;j>=b[i];j--)
{
dp[j]=max(dp[j],dp[j-b[i]]+c[i]);
}
}
cout<<dp[k]<<endl;
}
}