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;
}