A
模拟
n=int(input())
x=1
d=1
i=2
while x<=n:
d+=1
x+=i
i*=2
print(d)
B
排序
#include<bits/stdc++.h>
using namespace std;
string str[110];
int main()
{
int n;
cin>>n;
int x=0;
for(int i=0;i<n;i++)
{
string s;
int w;
cin>>s>>w;
x+=w;
str[i]=s;
}
sort(str,str+n);
cout<<str[x%n]<<endl;
return 0;
}
C
自定义排序
按照A排序,再从后往前砍掉逆序的C
#include<bits/stdc++.h>
using namespace std;
int n;
const int N = 2e5 + 10;
struct node{
int idx;
int A;
int C;
}a[N];
bool cmd(node x,node y)
{
return x.A<y.A;
}
bool cmd1(node x,node y)
{
return x.idx<y.idx;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int g,h;
cin>>g>>h;
a[i].idx=i;
a[i].A=g;
a[i].C=h;
}
sort(a+1,a+n+1,cmd);
int res=0;
int minx=a[n].C;
for(int i=n-1;i>=1;i--)
{
if(a[i].C>minx)
{
a[i].idx=0;
res++;
}
else
{
minx=min(minx,a[i].C);
}
}
sort(a+1,a+n+1,cmd1);
cout<<n-res<<endl;
for(int i=1;i<=n;i++)
{
if(a[i].idx!=0) cout<<a[i].idx<<" ";
}
cout<<endl;
return 0;
}
D
计算面积
需要计算4部分
X*Y:先计算完整的4*2矩阵
MY*X:如果y余下一行(MY那一行),再计算余下的一行,x*4(这里的x是除以4得到的整数)
MX*Y:因为是有规律的矩形,所以不需要考虑是否题目要求的面积的边界不是规律矩形的边界
即可以从右往左依次计算多余的mx,最后乘以y
MX*MY:如果存在MY,那么他就只是一行,所以计算mx时候,可以直接计算
需要注意取模4的结果,来建立二维数组
#include<bits/stdc++.h>
using namespace std;
int q[5][2]={{1,0},{2,1},{1,2},{0,1}};
//int q[5][2]={{2,1},{1,2},{0,1},{1,0}};
const int M = 1e9;
#define int long long
signed main()
{
int a,b,c,d;
cin>>a>>b>>c>>d;
a+=M;
b+=M;
c+=M;
d+=M;
// cout<<q[0][0]<<" "<<q[0][1]<<endl;
// cout<<q[1][0]<<" "<<q[1][1]<<endl;
// cout<<q[2][0]<<" "<<q[2][1]<<endl;
// cout<<q[3][0]<<" "<<q[3][1]<<endl;
int x=(c-a)/4,mx=(c-a)%4;
int y=(d-b)/2,my=(d-b)%2;
// cout<<x<<" "<<my<<endl;
int s=x*y*8;
if(my==1) s+=4*x;
int ns=0;
for(int i=0,j=c;i<mx;i++,j--)
{
ns+=q[j%4][0]+q[j%4][1];
if(my==1)
{
s+=q[j%4][b%2==0 ? 0 : 1];
// cout<<s<<endl;
}
}
// cout<<s<<endl;
s+=ns*y;
cout<<s<<endl;
return 0;
}