4644求和
注意longlong的使用,注意数组
#include<iostream>
using namespace std;
typedef long long ll;
const int maxx = 2e5+2;
int main(){
int N;
cin>>N;
ll res = 0;
ll sum=0;
ll a[maxx];
for(int i=1;i<=N;i++){
cin>>a[i];
sum+=a[i];
}
for(int i=1;i<=N;i++){
sum-=a[i];
res+=sum*a[i];
}
cout<<res<<endl;
return 0;
}
4653数位排序
水中水,居然是用sort过的,好像时间复杂度就卡在边上
但是要在输入而不是cmp里计算数位和
#include<iostream>
#include<algorithm>
using namespace std;
const int maxx = 1e6+10;
struct Node{
int bitSum;
int num;
};
Node a[maxx];
bool cmp(Node a,Node b){
if(a.bitSum==b.bitSum){
return a.num<b.num;
}else{
return a.bitSum<b.bitSum;
}
}
int getBitSum(int num){
int res = 0;
while(num){
res+=num%10;
num/=10;
}
return res;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
a[i].num=i;
a[i].bitSum=getBitSum(i);
}
sort(a+1,a+n+1,cmp);
cout<<a[m].num<<endl;
return 0;
}
4652纸张尺寸
超级大水题
#include<iostream>
using namespace std;
int main(){
string name;
cin>>name;
int cnt = (int)(name[1]-'0');
int l=1189,w=841;
for(int i=0;i<cnt;i++){
l=l/2;
if(l<w){
swap(l,w);
}
}
cout<<l<<endl<<w<<endl;
return 0;
}
4655重新排序
差分:d[i]=a[i]-a[i-1],获取a[i]就用d[i]累加,区间变化就是对d[left]操作,然后对d[right+1]反向操作
注意因为已经用差分数组计数了,所以求多个区间的和不用一个一个加了,可以在恢复差分的原数组时用a[i]*(chafen[i]-chafen[i-1])
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxx=1e5+10;
typedef long long ll;
int main(){
int n;
cin>>n;
ll a[maxx];
ll oldSum=0;
ll newSum=0;
//差分数组
ll d[maxx];
memset(d,0,sizeof d);
for(int i=1;i<=n;i++){
cin>>a[i];
}
int m;
cin>>m;
//多次区间+1,时间复杂度On
while(m--){
int l,r;
cin>>l>>r;
d[l]++;
d[r+1]--;
}
//差分恢复
for(int i=1;i<=n;i++){
d[i]=d[i]+d[i-1];
oldSum+=d[i]*a[i];
}
sort(a+1,a+n+1);
sort(d+1,d+n+1);
for(int i=1;i<=n;i++){
newSum+=d[i]*a[i];
}
cout<<newSum-oldSum<<endl;
return 0;
}
4509归一化处理
模拟题,也算是复习机器学习了
#include<iostream>
#include<cmath>
using namespace std;
const int maxx = 1e5;
double a[maxx];
double tar[maxx];
double avg(int N){
double sum = 0;
for(int i=0;i<N;i++){
sum+=a[i];
}
return sum/N;
}
double square(int N,double avg){
double sum = 0;
for(int i=0;i<N;i++){
sum+=pow(a[i]-avg,2);
}
return sqrt(sum/N);
}
void normalize(int N){
double avg_num = avg(N);
double s_num = square(N,avg_num);
for(int i=0;i<N;i++){
tar[i]=(a[i]-avg_num)/s_num;
}
}
int main(){
int N;
cin>>N;
for(int i=0;i<N;i++){
cin>>a[i];
}
normalize(N);
for(int i=0;i<N;i++){
cout<<tar[i]<<endl;
}
return 0;
}