美丽的2
cpp
#include <iostream>
using namespace std;
int main()
{
int cnt=0;
int tmp;
for(int i=1;i<=2020;i++)
{
tmp=i;//避免改变i的值
while(tmp)
{
if(tmp%10==2)
{
cnt++;
break;
//有2就跳出循环
}
tmp/=10;
}
}
cout<<cnt;
return 0;
}
基础不牢地动山摇是我这样的。这个题花费的时间远远超出了我的预期,原来喜欢看着思路对着写,就像高中对着答案思考一样,真是要不得,我都不敢想我过去一个月的题到底能提高多么少
子树的大小
cpp
#include <iostream>
using namespace std;
#define LL long long
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--)
{
LL n, m, k;
cin >> n >> m >> k;
LL cnt = 1; // 初始化计数器为1,包括节点k自身
LL lchild = k, rchild = k;
bool flag=0;
while (1)
{
lchild = (lchild - 1) * m + 2;
rchild = rchild * m + 1;
if (lchild > n) break;
// 如果最左孩子编号超出n,则没有更多子节点
if (rchild >= n)
{
rchild = n; // 如果最右孩子编号超出n,调整为n
flag=1; // 由于算法逻辑,这里应该退出循环
}
cnt += rchild - lchild + 1;
if(flag) break;
}
cout << cnt << endl;
}
return 0;
}
感谢冯勒布大佬细致的解析,一下子就明白了(不灵不灵眼)
有奖问答
cpp
#include<iostream>
using namespace std;
int ans=0;
void dfs(int cnt,int res)
{
if(res==100||cnt>=31)
return ;
if(res==70)
ans++;
dfs(cnt++,res+10);
dfs(cnt++,0);
}
int main()
{
//dfs(0,0);
cout << 8335366;
return 0;
}
递归所有可能的情况会导致指数级的增长,每一步都有两种选择:答对或答错。如果考试有n道题目,那么可能的情况数就是2的n次方。这也是为什么递归方法在问题规模较大时可能会变得非常耗时的原因之一。(理解更深入了)
数位排序
cpp
#include <iostream>
#include<algorithm>
using namespace std;
const int N=1e6+5;
int cnt[N],ans[N];
bool cmp(int x,int y)
{
return cnt[x]<cnt[y]||cnt[x]==cnt[y]&&x<y;
}
int main()
{
int n;
cin>>n;
int m;
cin>>m;//1 to n ,position m
for(int i=1;i<=n;i++)
{
int tmp=i;
while(tmp)
{
cnt[i]+=tmp%10;
tmp/=10;
}
ans[i]=i;
}
sort(ans+1,ans+n+1,cmp);
cout<<ans[m];
// 请在此输入您的代码
return 0;
}
自定义sort的妙用,主要是这个ans[i]=i;感觉真挺妙的
string str="WHERE THEREISAWILLTHEREISAWAY"; sort(str.begin(),str.end());
scanf("A%d",&a);
还有一个递增的裁纸题,就这一个点比较值得记下
重新排序(不开LL见祖宗)
cpp
#include <iostream>
#include <algorithm>
#define LL long long
using namespace std;
long long num[100002]; //输入
unsigned int sum[100002]; //相加频率
unsigned int diff[100002]; //差分数组
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>num[i];
int m;
cin>>m;
int sumdiff=0;
LL sum1=0;
LL sum2=0;
for(int i=0;i<m;i++)
{
int l,h;
cin>>l>>h;
diff[l-1]++; //差分左边缘加一
diff[h]--; //差分右边缘减一
}
for(int i=0;i<n;i++) //求频率
{
sumdiff+=diff[i];
sum[i]=sumdiff;
}
for(int i=0;i<n;i++) //求原始和大小
sum1+=num[i]*sum[i];
sort(&sum[0],&sum[n]); //数值排序
sort(&num[0],&num[n]);//频率排序
for(int i=0;i<n;i++) //求最大和大小
sum2+=num[i]*sum[i];
cout<<sum2-sum1<<endl;
return 0;
}
//unsigned int 类型&long long 类型的变量进行乘法,unsigned int 类型的变量会自动被提升为 long long
cpp
#include <iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int N=1e6+5;
LL a[N];
LL dif[N]={0};
LL sum1=0,sum2=0;
int main()
{
LL n;
cin>>n;
for(LL i=0;i<n;i++)
{
cin>>a[i];//数据
}
LL m;
cin>>m;//组数
LL l,r;
while(m--)
{
cin>>l>>r;
dif[l-1]++;
dif[r]--;
}
for(LL i=0;i<n;i++)
{
dif[i]+=dif[i-1];
sum1+=dif[i]*a[i];
}
sort(dif,dif+n);
sort(a,a+n);
for(LL i=0;i<n;i++)
{
sum2+=dif[i]*a[i];
}
cout<<sum2-sum1;
// 请在此输入您的代码
return 0;
}
填充
cpp
#include <iostream>
using namespace std;
int main()
{
string str;
cin>>str;
int n=0;
for(int i=0;i<str.length()-1;i++)
{
if(str[i]==str[i+1]||str[i]=='?'||str[i+1]=='?')
{
n++;
i++;//连跳两位,厉害的
}
}
cout<<n;
return 0;
}
翻转
cpp
#include <iostream>
#include <string>
using namespace std;
void solve() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
string s, t;
cin >> s >> t;
if (s[0] != t[0] || s[s.size() - 1] != t[t.size() - 1])
{
// 首尾不同,无法翻转
cout << -1 << endl;
}
else {
int cnt = 0;
for (int i = 1; i < s.size() - 1; i++) {
if (s[i] != t[i] && t[i] != t[i - 1] && t[i] != t[i + 1]) {
t[i] = t[i - 1];
cnt++;
}
}
if (s == t)
cout << cnt << endl;
else
cout << -1 << endl;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T=1;
while (T--) {
solve();
}
return 0;
}
盖印章
cpp
#include <iostream>
using namespace std;
using LL=long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
LL n,m,k;
int cnt=0;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
string s;
cin>>s;
for(int j=0;j<m;j++)
{
if(s[j]=='1')
cnt++;
}
}
cout<<cnt-2*k<<' '<<3*k-cnt;
return 0;
}
/*#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,k;
cin>>n>>m>>k;
int cnt=0;//统计1的个数
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
char c;
cin>>c;
if(c=='1')cnt++;
}
cout<<cnt-2*k<<' '<<3*k-cnt;//输出A和B的使用次数
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m, k; cin >> n >> m >> k;
ll x = 0;
for (int i = 1; i <= n; i++) {
string s; cin >> s;
x += count(s.begin(), s.end(), '1');
}
cout << x - 2 * k << " " << 3 * k - x << endl;
return 0;
}*/
抽象,解题区法秒了()
最近随便敲了敲比较简单的题,突然感觉就这么敲一辈子代码也挺好的,每次只要拿起来都是依依不舍的放下,只可惜人不能既要又要(没想到看的人越来越多了,开心有这么多人见证我的进步,也依旧好喜欢碎碎念,未来谁又知道呢)