第三次小组赛解题报告
生活随笔
收集整理的這篇文章主要介紹了
第三次小组赛解题报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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; } View Code?
?約 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; } View Code?
?
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; } View Code?
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; } View Code?
轉載于:https://www.cnblogs.com/kylehz/p/4398939.html
總結
以上是生活随笔為你收集整理的第三次小组赛解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FTP中传输模式:BIN与ASC的差别
- 下一篇: sctp和tcp的区别