A九进制转十进制:1478
B 顺子日期:14 or 4不确定
这谁顶的住,反正题目有歧义
C 刷题统计:
这题也没什么好说的,就是数不小需要提前取余处理,总题数取余星期做题数量,剩下的模拟一下
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
int main(){
ll a,b,n,sum,mo;
cin>>a>>b>>n;
sum=n/(5*a+2*b);
mo=n%(5*a+2*b);
sum*=7;
for(int i=1;i<=7;i++){
if(mo>0){
if(i<=5)mo-=a;
else mo-=b;
sum++;
}
}
cout<<sum<<endl;
}
D修建灌木:
贪心或者手动模拟一下就可以了,可以发现最高的就是灌木两边的距离乘以二取最大就ok了
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define x first
#define y second
using namespace std;
const int N=1e5+20;
typedef long long ll;
typedef pair<int,int> PII;
int a[N];
int main(){
int n,sum;
cin>>n;
sum=(n-1)*2;
for(int i=1;i<=n;i++){
a[i]=max(sum-(n-i)*2,sum-(i-1)*2);
}
if(n==1){
cout<<1<<endl;
}else{
for(int i=1;i<=n;i++){
cout<<a[i]<<endl;
}
}
}
E X进制数:
这就很无语当时考试想不出来死活想不通是咋进的,现在知道就是末尾一直加该数位满了进一不能单纯用二进制每位乘的思想,其实也相当于每个位置的数乘以该位置向后数一个数之后的所有的权值之积得出来的值,
代码不难不过我事后调bug,老是看错题调了一会
#include<iostream>
using namespace std;
typedef long long ll;
ll mo=1000000007;
ll a[100010],b[100010],c[110000];
int main()
{
int N;
cin>>N;
int n,m;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>m;
for(int i=n-m+1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
c[i]=max(a[i]+1,max(b[i]+1,2*1ll));
}
c[n+1]=1;
ll cnt=0;
for(int i=n;i>=1;i--){
c[i]=(c[i]*c[i+1])%mo;//cout << c[i]<<' ';
}
for(int i=n;i>=1;i--){
cnt=(cnt+c[i+1]*a[i])%mo;
}
for(int i=n;i>=n-m+1;i--){//
cnt=(cnt-c[i+1]*b[i])%mo;
}
cout<<(cnt+mo)%mo<<endl;
}
F 统计子矩阵:
考场不会正解所以写的四维的前缀和
贴个tle的代码先,应该不会有人骂我吧
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define x first
#define y second
using namespace std;
const int N=520;
typedef long long ll;
typedef pair<int,int> PII;
ll a[N][N];
ll sum[N][N];
int main(){
ll n,m,t;
cin>>n>>m>>t;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
}
int cnt=0;
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
for(int k=i+1;k<=n;k++){
for(int r=j+1;r<=m;r++){
if((sum[k][r]+sum[i][j]-sum[k][j]-sum[i][r])<=t){
cnt++;
}
}
}
}
} cout<<cnt<<endl;
}
G 积木画:
状压没复习,敢考我就敢G
H 扫雷:
同样还没有过贴个tle的代码想到了优化就回来改
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#define x first
#define y second
using namespace std;
const int N=5e4+20;
typedef long long ll;
typedef pair<int,int> PII;
int x[N],y[N],r[N];
int px[N],py[N],pr[N];
map<PII,int>h;
map<PII,int>f;
queue<PII>q;
int main(){
int n,m;
cin>>n>>m;
for(int i =1;i<=n;i++){
scanf("%d%d%d",&x[i],&y[i],&r[i]);//cin>>x[i]>>y[i]>>r[i];
h[{x[i],y[i]}]=r[i];
}
for(int j=1;j<=m;j++){
scanf("%d%d%d",&px[j],&py[j],&pr[j]);
h[{px[j],py[j]}]=pr[j];
f[{px[j],py[j]}]=1;
q.push({px[j],py[j]});
}
int cnt=0;
while(q.size()){
PII t=q.front();
q.pop();
for(int j=1;j<=n;j++){
//cout<<t.x<<" "<<t.y<<endl;
if(h[{t.x,t.y}]*h[{t.x,t.y}]*1ll>=((t.x-x[j])*(t.x-x[j])+(t.y-y[j])*(t.y-y[j]))*1ll&&f[{x[j],y[j]}]==0){
cnt++;
f[{x[j],y[j]}]=1;
q.push({x[j],y[j]});
}
}
}
cout<<cnt<<endl;
}
I 李白打酒:
考场是写了一个二进制枚举的暴力
正解肯定是三维的线性dp考场没想出来
事后补提如下
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#define x first
#define y second
using namespace std;
const int N=100+20;
typedef long long ll;
ll a[N],f[N][N][N];//经过了i个花j个店,还有k斗酒的情况
const int mo= 1000000007;
int main(){
int n,m;
cin>>n>>m;
//0 hua -1
//1 dian *2
f[0][0][2]=1;
for(int i=0;i<=m;i++){
for(int j=0;j<=n;j++){
for(int k=0;k<=N;k++){
if(i>0)f[i][j][k]=(f[i][j][k]+f[i-1][j][k+1])%mo;//遇到花的时候
if(j>0&&k%2==0)f[i][j][k]=(f[i][j][k]+f[i][j-1][k/2])%mo;//遇到店的时候,因为是子问题所以一定要是跟二取余是零的才能转移
}
}
}
cout<<f[m-1][n][1];
/*
为甚么要取到这个不取f[m][n][0]呢其实是因为取f[m][n][0]不止有从倒数第二是花转移来的
*/
}
J 砍竹子:
据说是一道大顶堆的贪心题考场没时间想。。。