http://acm.zcmu.edu.cn/JudgeOnline/contest.php?cid=1088
Eatting 水
题目意思是没有朋友的人全部离开,有1个朋友的所有人离开,有2个朋友的所有人离开,......,问最后最多剩下几个人?
n-2个人可以构成一个完全图,他们每个人有n-3个朋友,再加入两个人,这两个人分别与前面n-2个人相连,这样前面的n-2个人有n-1个朋友,后面两个人有n-2个朋友。
当去除后面加的两个人后,剩下n-2个人都有n-3个朋友,不能再去除。所以最多剩下n-2人。
当n=1 或者2 时,不可能有人剩下
如图:

#include<iostream> #include<cstdio> using namespace std; #define ll long long int main() { int n; int T; scanf("%d",&T); while(T--) { scanf("%d",&n); if(n==2||n==1)puts("0"); else printf("%d\n",n-2); } return 0; }
约 dfs暴力
一行一行搜,假设现在搜第x行
1. x该行没有'o', 跳到x+1行
2. 有'o'在点(x,y)
分两种: 如果是(x+1,y-1)也是'o', 则在(x,y-1)点喷药水或者在(x,y)点喷药水
如果是(x+1,y-1)不是'o',要在(x,y)喷药水

提供两组数据
2 4
..oo
oo.o
4 4
..o.
oooo
..oo
...o
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,m; char mp[20][20]; int cnt; int mi; int dx[4]={0,0,1,1}; int dy[4]={0,1,0,1}; void dfs(int x,int y,int num,int sum) { if(sum==cnt) { // puts("final check:"); // for(int i=0;i<n;i++)puts(mp[i]); mi=min(num,mi); return; } if(x>n)return; while(y<m&&mp[x][y]=='.')y++; if(y>=m)dfs(x+1,0,num,sum); //反L,取或不取mp[x][y-1]处 if(y-1>=0&&mp[x+1][y-1]=='o') { int v[4]={0}; int c=0; for(int i=0;i<4;i++) { int xx=x+dx[i]; int yy=y-1+dy[i]; if(mp[xx][yy]=='o') { mp[xx][yy]='.'; v[i]=1; c++; } } // printf("1** %d %d\n",x,y); // for(int i=0;i<n;i++)puts(mp[i]); dfs(x,y+1,num+1,sum+c); for(int i=0;i<4;i++) { if(v[i]) mp[x+dx[i]][y-1+dy[i]]='o'; } } //必取 if(mp[x][y]=='o'){ int v[4]={0}; int c=0; for(int i=0;i<4;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(mp[xx][yy]=='o') { mp[xx][yy]='.'; v[i]=1; c++; } } // printf("2** %d %d\n",x,y); // for(int i=0;i<n;i++)puts(mp[i]); dfs(x,y+2,num+1,sum+c); for(int i=0;i<4;i++) { if(v[i]) mp[x+dx[i]][y+dy[i]]='o'; } } } int main() { while(~scanf("%d%d",&n,&m)) { cnt=0; for(int i=0;i<n;i++){ scanf("%s",mp[i]); for(int j=0;j<m;j++){ if(mp[i][j]=='o') { cnt++; } } } /* if(ca==49) { printf("%d %d\n",n,m); for(int i=0;i<n;i++)puts(mp[i]); } ca++; */ for(int i=0;i<20;i++) { for(int j=0;j<20;j++){ if(i>=n||j>=m)mp[i][j]='.'; } mp[i][15]='\0'; } mi=99999999; dfs(0,0,0,0); printf("%d\n",mi); } return 0; }
To Be The Calculator 计算加减乘除,水,模拟
~~~
火车奇遇 计算概率,线性规划
一条直线与矩形的位置有六种方式,因为w一样,所以斜率为1,把两条直线与矩阵相交都讨论清楚就可以了


#include<iostream> #include<cstdio> using namespace std; int t1,t2,s1,s2,w; double S; double pow(double x) { return x*x; } int main() { while(~scanf("%d%d%d%d%d",&t1,&t2,&s1,&s2,&w)) { S=(t2-t1)*(s2-s1); double area1=0,area2=0; if(t2+w<s1)area1=S; else if(t2+w<s2){ if(t1+w<s1)area1=S-0.5*pow(t2+w-s1); else area1=0.5*pow(s2-(t1+w))-0.5*pow(s2-(t2+w)); } else { if(t1+w<s1)area1=0.5*pow(s2-(t1+w))-0.5*pow(s1-(t1+w)); else if(t1+w<s2)area1=0.5*pow(s2-(t1+w)); else area1=0; } if(s2+w<t1)area2=S; else if(s2+w<t2){ if(s1+w<t1)area2=S-0.5*pow(s2+w-t1); else area2=0.5*pow(t2-(s1+w))-0.5*pow(t2-(s2+w)); } else{ if(s1+w<t1)area2=0.5*pow(t2-(s1+w))-0.5*pow(t1-(s1+w)); else if(s1+w<t2)area2=0.5*pow(t2-(s1+w)); else area2=0; } // printf("area1=%lf area2=%lf S=%lf\n",area1,area2,S); printf("%.8lf\n",(S-area1-area2)/S); } return 0; }
1+++
水 数全由1构成,判断是否能整除n,每次对n取余即可
#include<iostream> #include<cstdio> using namespace std; int main() { int n; while(~scanf("%d",&n)) { int x=0; int i=0; while(++i) { x=(x*10+1)%n; if(x==0) { printf("%d\n",i); break; } } } return 0; }
浙公网安备 33010602011771号