P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
#include<bits/stdc++.h>
using namespace std; int n, na, nb, fa, fb;//f:得分
int a[205], b[205];void fun(int ta, int tb){if(ta == 0 && tb == 1) fb++;if(ta == 1 && tb == 0) fa++;if(ta == 0 && tb == 2) fa++;if(ta == 2 && tb == 0) fb++;if(ta == 0 && tb == 3) fa++;if(ta == 3 && tb == 0) fb++;if(ta == 0 && tb == 4) fb++;if(ta == 4 && tb == 0) fa++; if(ta == 1 && tb == 2) fb++;if(ta == 2 && tb == 1) fa++;if(ta == 1 && tb == 3) fa++;if(ta == 3 && tb == 1) fb++;if(ta == 1 && tb == 4) fb++;if(ta == 4 && tb == 1) fa++;if(ta == 2 && tb == 3) fb++;if(ta == 3 && tb == 2) fa++;if(ta == 2 && tb == 4) fa++;if(ta == 4 && tb == 2) fb++; if(ta == 3 && tb == 4) fa++;if(ta == 4 && tb == 3) fb++;
}
int main()
{cin >> n >> na >> nb;for(int i=0; i<na; i++)cin >> a[i];for(int i=0; i<nb; i++)cin >> b[i];int ta, tb;for(int i=0; i<n; i++){//进行n轮 ta = a[i%na];tb = b[i%nb];fun(ta, tb);}cout<< fa << " " << fb << endl;return 0;
}
得分表 --- > 简化代码:
#include<bits/stdc++.h>
using namespace std; int n, na, nb, fa, fb;//f:得分
int a[205], b[205];
int s[5][5] = {{0, 1, 0, 0, 1},{0, 0, 1, 0, 1},{1, 0, 0, 1, 0},{1, 1, 0, 0, 0},{0, 0, 1, 1, 0}};
// 行表示b,列表示a,s[b][a]=1:表示列a得分
int main()
{cin >> n >> na >> nb;for(int i=0; i<na; i++)cin >> a[i];for(int i=0; i<nb; i++)cin >> b[i];int ta, tb;for(int i=0; i<n; i++){//进行n轮 ta = a[i%na];tb = b[i%nb];fa += s[tb][ta];//a得分 fb += s[ta][tb];//b得分 }cout<< fa << " " << fb << endl;return 0;
}
P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two
如果 John 和牛永远不会相遇,输出 0。(实在不会,就设一个大一点的maxt ...... )
如果两个物体先后两次从同一个方向走到同一个地点,我们就可以说它们陷入了死循环。
专属值 = 农夫的x坐标+他的y坐标* 10+奶牛的x坐标* 100+奶牛的y坐标* 1000+农夫的方向* 10000+奶牛的方向* 40000(农夫方向最多为4)但这样会超时,就直接t>10000即死循环
这里面权重的取值很关键! 权重分别为 1 10 100 1000 10000 40000,包括了所有的情况。
个位数的值 只与 农夫的X 坐标挂钩,因为其他的部分都不会影响个位数的取值;
同理 十位数与 Y 挂钩 其他的也是
而 10000 与 40000, 因为前面是坐标,而地图大小为 10*10 , 有0-9(或者1- 10) 10种可能, 而后面两个是方向 上下左右只需要四个值即可表示 0 1 2 3因此 最后一项的权重是 40000(当然你×100000应该也没问题,但是40000更小节约内存嘛)
这样,将每一种情况都保存起来, 确保不会出现重复 (出现重复,则说明 牛 和 农夫在绕圈子 , 永远也走不到一起,即捕捉失败) 其实没太懂,,,记录一下。
#include<bits/stdc++.h>
using namespace std; char mp[12][12], c;
int cx, cy, fx, fy, t, d[2], f;//f=0,d[0]:牛,f=1,d[1]:人
// d=0:向上;d=1:向右;d=2:向下;d=3:向左
//bool zt[160005]; int tdz;//专属值 (会超时!)void move(int x,int y, int td, int f){if(td == 0){ if(mp[x-1][y] == '*'){if(f == 0) d[0] = 1;else d[1] = 1;}else{if(f == 0) fx--;else cx--;}}else if(td == 1){if(mp[x][y+1] == '*'){if(f == 0) d[0] = 2;else d[1] = 2;}else{if(f == 0) fy++;else cy++;}}else if(td == 2){if(mp[x+1][y] == '*'){if(f == 0) d[0] = 3;else d[1] = 3;}else{if(f == 0) fx++;else cx++;}}else{if(mp[x][y-1] == '*'){if(f == 0) d[0] = 0;else d[1] = 0;}else{if(f == 0) fy--;else cy--;}}
}
int main()
{memset(mp, '*', sizeof(mp));//在边缘加一圈 * for(int i=1;i<=10; i++){for(int j=1; j<=10; j++){cin >> c;mp[i][j] = c;if(mp[i][j] == 'F')fx = i,fy = j;if(mp[i][j] == 'C')cx = i,cy = j;}}while(1){//tdz=fx+fy*10+cx*100+cy*1000+d[0]*10000+d[1]*40000;//if (zt[tdz]){ t = 0;break; }//死循环了就输出0并结束程序if(fx == cx && fy == cy) break;if(t > 10000){ t = 0; break;}move(fx, fy, d[0], 0);move(cx, cy, d[1], 1);t ++ ;//计时 }cout << t << endl;return 0;
}
P1067 [NOIP2009 普及组] 多项式输出
看似简单但不容易考虑周全
#include<bits/stdc++.h>
using namespace std; int n, a[105];
int main()
{cin >> n;for(int i=n; i>=0; i--){cin >> a[i];if(a[i]){if(i!=n && a[i]>0)cout<<"+";//第一项不加 + if(abs(a[i])>1 || i==0)cout<<a[i];//系数为 0 不输出 if(a[i]==-1 && i)cout<<"-";//系数为 -1 只输出 - if(i>1)cout<<"x^"<<i;//大多项输出 ^ if(i==1)cout<<"x";//一次项不输出 ^ }}return 0;
}