- chenshixian 的博客
陈室先的总结8.22day25
- @ 2024-8-22 16:07:10
题目传送门
T1小K的疑惑
思路
公式是 (a-1)*(b-1)-1,如有疑问请自行打表
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("dontforgetfileio.in","r",stdin);
freopen("dontforgetfileio.out","w",stdout);
long long a,b;
cin>>a>>b;
cout<<(b-1)*(a-1)-1;
}
T2 Milk Measurement
思路
直接一天天的算就行了,如果有变动则更新并计数
代码
#include<bits/stdc++.h>
using namespace std;
int a=1,b=1,c=1,cn;
int st[1111][10];
int main(){
freopen("milk2.in","r",stdin);
freopen("milk2.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++){
int day,l;
string m,xx;
cin>>day;
cin>>m;
cin>>xx;
int x=0;
for(int i=1;i<xx.size();i++)x=x*10+xx[i]-'0';
l=x;
if(xx[0]=='-')l=-l;
if(m[0]=='B')st[day][1]+=l;
if(m[0]=='E')st[day][2]+=l;
if(m[0]=='M')st[day][3]+=l;
}
int aaa=7,bbb=7,ccc=7;
for(int i=1;i<=100;i++){
aaa+=st[i][1];
bbb+=st[i][2];
ccc+=st[i][3];
int x=aaa,y=bbb,z=ccc;
int aa=0,bb=0,cc=0,m=max(x,max(y,z));
if(x==m)aa=1;
if(y==m)bb=1;
if(z==m)cc=1;
if(aa!=a||bb!=b||cc!=c){
cn++;
a=aa;
b=bb;
c=cc;
}
}
cout<<cn;
}
T3 Stack in a rut
思路

两个点p(E),q(N),要满足p.x<q.x&&p.y>q.y p排序用x排,q排序用y排 p点到相交点的距离是p.x-q.x p点到相交点的距离是p.y-q.y 注意一个(p/q)点可能会被提前的其他点拦截
代码
#include<bits/stdc++.h>
using namespace std;
int aa,bb,da[10000],dd[10000],n;
struct P{
int x,y,id;
}a[1000],b[1000];
bool cmp1(P a,P b){
return a.y<b.y;
}
bool cmp2(P a,P b){
return a.x<b.x;
}
int main(){
freopen("stack.in","r",stdin);
freopen("stack.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
char x;
cin>>x;
if(x=='N'){
aa++;
cin>>a[aa].x>>a[aa].y;
a[aa].id=i;
}
else{
bb++;
cin>>b[bb].x>>b[bb].y;
b[bb].id=i;
}
}
sort(a+1,a+1+aa,cmp1);
sort(b+1,b+1+bb,cmp2);
for(int i=1;i<=aa;i++){
int xx=a[i].x,yy=a[i].y;
int h=1000000000;
for(int j=1;j<=bb;j++){
int x=b[j].x,y=b[j].y;
if(x<xx&&y>yy){
int jb=abs(a[i].x-b[j].x);
int ib=abs(a[i].y-b[j].y);
if(ib>jb){
h=min(h,ib);
}
}
}
da[a[i].id]=h;
}
for(int i=1;i<=bb;i++){
int x=b[i].x,y=b[i].y;
int h=1000000000;
for(int j=1;j<=aa;j++){
int xx=a[j].x,yy=a[j].y;
if(x<xx&&y>yy){
int ib=abs(b[i].x-a[j].x);
int jb=abs(b[i].y-a[j].y);
if(ib>jb&&jb<=da[a[j].id]){
h=min(h,ib);
}
}
}
dd[b[i].id]=h;
}
for(int i=1;i<=bb;i++){
int x=b[i].x,y=b[i].y;
int h=1000000000;
for(int j=1;j<=aa;j++){
int xx=a[j].x,yy=a[j].y;
if(x<xx&&y>yy){
int ib=abs(b[i].x-a[j].x);
int jb=abs(b[i].y-a[j].y);
if(ib>jb){
h=min(h,ib);
}
}
}
da[b[i].id]=h;
}
for(int i=1;i<=aa;i++){
int xx=a[i].x,yy=a[i].y;
int h=1000000000;
for(int j=1;j<=bb;j++){
int x=b[j].x,y=b[j].y;
if(x<xx&&y>yy){
int jb=abs(a[i].x-b[j].x);
int ib=abs(a[i].y-b[j].y);
if(ib>jb&&jb<=da[b[j].id]){
h=min(h,ib);
}
}
}
dd[a[i].id]=h;
}
for(int i=1;i<=n;i++){
if(dd[i]==1000000000)cout<<"Infinity";
else cout<<dd[i];
cout<<"\n";
}
}
错误与感想
考试的时候直接骗分,再写的时候细节有点没注意
以后考试时没写题目要多想一下,细节也要注意
T4 Air Cownditioning II
思路
DFS搜索,对于每一步,遍历[1,100],记录情况,再看是否满足要求,满足则更新
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000],b[1000],mq=1000000;
struct P{
int x,y,p,q;
}k[1000];
void dfs(int w,int q,int s){
if(s==0){
mq=min(mq,q);
return;
}
if(w>m&&s!=0)return;
dfs(w+1,q,s);
for(int l=k[w].x;l<=k[w].y;l++)b[l]+=k[w].p;
int ss=0;
for(int i=1;i<=100;i++)if(b[i]>=a[i])ss++;
ss=100-ss;
dfs(w+1,q+k[w].q,ss);
for(int l=k[w].x;l<=k[w].y;l++)b[l]-=k[w].p;
}
int main(){
freopen("air.in","r",stdin);
freopen("air.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
int x,y,w;
cin>>x>>y>>w;
for(int j=x;j<=y;j++)a[j]=w;
}
for(int i=1;i<=m;i++)cin>>k[i].x>>k[i].y>>k[i].p>>k[i].q;
dfs(1,0,100);
cout<<mq;
}
错误与感想
比赛时随机数骗分,还居然没看出是****搜索题!!!太对不起搜索之子的称号了·
以后要积极写题,特别是****搜索题