国庆模拟赛(一)
1、P3958 [NOIP2017 提高组] 奶酪
算法思路:深搜?!
可能的思路:并查集
(代码有一处智商错误,已改正)
#include<bits/stdc++.h>
using namespace std;
int T;
int a[1010][1010];
int vis1[1010];//up
int vis2[1010];//down
int vis[1010];//colour
int n,h,r;
int x[1010],y[1010],z[1010];
bool f=false;
int cha(int tt,int t){
if(tt>t) return tt-t;
else return t-tt;
}
bool check(int i,int j){
double dist=0;
int xx=cha(x[i],x[j]);
int yy=cha(y[i],y[j]);
int zz=cha(z[i],z[j]);
dist=sqrt((long double)xx*xx+(long double)yy*yy+(long double)zz*zz);
if(dist<=2.0*r) return true;
else return false;
}
void connect(){
for(int i=1;i<=n;i++){
if(z[i]+r>=h) vis1[i]=1;
if(r>=z[i]) vis2[i]=1;
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(check(i,j)){
a[i][j]=a[j][i]=1;
}
}
}
}
void colour(int x){
vis[x]=1;
for(int i=1;i<=n;i++){
if(a[x][i]&&vis[i]==0){
colour(i);
}
}
}
int main(){
//freopen("cheese.in","r",stdin);
//freopen("cheese.out","w",stdout);
scanf("%d",&T);
while(T--){
memset(a,0,sizeof(a));
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
memset(vis,0,sizeof(vis));
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(z,0,sizeof(z));
f=false;
scanf("%d %d %d",&n,&h,&r);
for(int i=1;i<=n;i++){
scanf("%d %d %d",&x[i],&y[i],&z[i]);
}
connect();
for(int i=1;i<=n;i++){
if(vis2[i]==1){
colour(i);
}
}
for(int i=1;i<=n&&f==false;i++){
if(vis1[i]&&vis[i]) f=true;
}
if(f) puts("Yes");
else puts("No");
}
return 0;
}
估分:80
实际得分:10(原)=>100 ???
反思:写题目要细心!智商要在线! 还有就是在判断大多数情况的主要代码没写好时最好不要先排除一些特殊情况,防止有认为主要代码OK其实有漏洞的情况。
2、P3952 [NOIP2017 提高组] 时间复杂度
算法思路:???
可能的思路
27分代码。。。
#include<bits/stdc++.h>
using namespace std;
int t,len,comp,tot=-1,cnt;
string bin,com,body;
int name[200];
bool f=false;
int getnum(string x,int f,int r){
int ans=0;
for(int i=f;i<=r;i++){
ans*=10;
ans+=x[i-1]-'0';
}
return ans;
}
void clean(){
memset(name,0,sizeof(name));
f=false;
tot=-1;
cnt=0;
}
int main(){
freopen("complexity.in","r",stdin);
freopen("complexity.out","w",stdout);
scanf("%d",&t);
while(t--){
clean();
scanf("%d",&len);
if(len%2!=0){
for(int i=0;i<=len;i++) getline(cin,bin);
puts("ERR");continue;
}
getchar();
getline(cin,com);
if(com[2]=='1') comp=0;
else comp=getnum(com,5,com.size()-1);
stack <char> ord;
for(int i=1;i<=len&&f==false;i++){
getline(cin,body);
if(body[0]=='F'){
ord.push('F');
if(name[body[2]]) f=true;
else name[body[2]]=1;
if(body[4]=='n'){
if(body[6]!='n') tot=cnt;
}
else{
int i=5;
while(body[i-1]!=' ') i++;
int l=getnum(body,5,i-1);
i++;
if(body[i-1]=='n'){
ord.pop();
ord.push('f');
cnt++;
}
else{
int r=getnum(body,i,body.size());
if(l>r) tot=cnt;
}
}
}
else{
if(ord.empty()) f=true;
else {
if(ord.top()=='f'){
tot=max(tot,cnt);
cnt--;
}
ord.pop();
}
}
}
if(!ord.empty()) f=true;
if(f) puts("ERR");
else{
if(tot==-1) tot=cnt;
if(tot==comp) puts("Yes");
else puts("No");
}
}
return 0;
}
估分:30
实际得分:27
反思:思维混乱是考场大忌,哪怕多想一点也最好不要乱写
(真的改不对。。。)
3、P1850 [NOIP2016 提高组] 换教室
算法思路:???
可能的思路:Floyd+DP
4、P2668 [NOIP2015 提高组] 斗地主
算法思路:???
可能的思路:给我搜??
总结:该骗分时要骗分,该思考时要思考。
嗑题要仔细。
蒟蒻的国庆模拟赛(一)
——2021.10.3
PS:作为一名蒟蒻,对于八方神犇的合理建议都是感激不尽的儿~~