B
错误做法:
思路错误,审题不清晰,我以为是输入的a[i]是越来越大的,也就是第i个女巫的需求量大于第i-1个女巫,其实并不是的,女巫的需求量是随机的,所以需要进行排序来比较判断。
#include<iostream>
using namespace std;
const int N=100010;
int main()
{
int n;
int x;
cin>>n>>x;
int a[N];
int d=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
if(x>a[i]&&x<a[i+1])
{
cout<<i<<' '<<x-a[i];
break;
}
else if(x<a[1])
{
cout<<'0'<<' '<<x;
break;
}
else if(x==a[i])
{
cout<<i<<' '<<'0';
break;
}
}
return 0;
}
修改后:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n, q[N], m;
int main(){
cin >> n >> m;
int i;
for(i=0;i<n;i++) cin >> q[i];
sort(q, q+n);
for( i=0;i<n;i++){
if(q[i] > m) break;
}
i--;
if(i>=0) m-=q[i];
cout << i+1<< " " << m;
return 0;
}
C
当时以为用字符串来做,但我这方面掌握的不太会,没有写代码的思路,看了直播回放后,发现用数的运算可以解决。并且题中运算需要加三位就可以包含所有情况。
#include<bits/stdc++.h>
using namespace std;
long long n;
int main() {
cin>>n;
if(n%495==0){
cout<<"-1";
return 0;
}
n=n%495;
for(int i=0;i<=9;i++){
long long s=n*10+i;
if(s%495==0){
cout<<i;
return 0;
}
}
for(int i=0;i<=99;i++){
long long s=n*100+i;
if(s%495==0){
printf("%02d",i); //"%02d"的意思是不足两位数左侧用0补齐
return 0;
}
}
for(int i=0;i<=995;i++){
long long s=n*1000+i;
if(s%495==0){
printf("%03d",i);
return 0;
}
}
return 0;
}
字符串做法:
#include<iostream>
using namespace std;
int main()
{
long long n,i;
// __int128 表示10^36,long long 最大表示到10^18
cin>>n;
if(n%495==0)
{
cout<<-1;
return 0;
}
n%=495;
string s=to_string(n); //to_string()整数转换成字符
for(i=0;i<10;i++)
{
string t=s;
string add=to_string(i);
t+=add;
if(stoi(t)%495==0) return cout<<add<<'\n',0; //stoi 字符转整数
//stoll 字符转long long
}
for(i=0;i<99;i++)
{
string t=s;
string add=to_string(i);
while(add.length()<2) add='0'+add;
t+=add;
if(stoi(t)%495==0) return cout<<add<<'\n',0;
}
for(i=0;i<999;i++)
{
string t=s;
string add=to_string(i);
while(add.length()<3) add='0'+add;
t+=add;
if(stoi(t)%495==0) return cout<<add<<'\n',0;
}
}