- T1 井字棋
- 题意:给定一井字棋残局,问结果
- 状压记忆化暴搜,博弈
-
1 #include<stdio.h> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 int po[20],ch[256]; 7 int f[100000][3]; 8 int judge(int s) 9 { 10 int g[10]; 11 for(int i=1,ss=s;i<=9;i++,ss/=3) g[i]=ss%3; 12 if(g[1]==g[2]&&g[2]==g[3]) 13 { 14 if(g[1]==1) return 1; 15 if(g[1]==2) return -1; 16 } 17 if(g[4]==g[5]&&g[5]==g[6]) 18 { 19 if(g[4]==1) return 1; 20 if(g[4]==2) return -1; 21 } 22 if(g[7]==g[8]&&g[8]==g[9]) 23 { 24 if(g[7]==1) return 1; 25 if(g[7]==2) return -1; 26 } 27 if(g[1]==g[4]&&g[4]==g[7]) 28 { 29 if(g[1]==1) return 1; 30 if(g[1]==2) return -1; 31 } 32 if(g[2]==g[5]&&g[5]==g[8]) 33 { 34 if(g[2]==1) return 1; 35 if(g[2]==2) return -1; 36 } 37 if(g[3]==g[6]&&g[6]==g[9]) 38 { 39 if(g[3]==1) return 1; 40 if(g[3]==2) return -1; 41 } 42 if(g[1]==g[5]&&g[5]==g[9]) 43 { 44 if(g[1]==1) return 1; 45 if(g[1]==2) return -1; 46 } 47 if(g[3]==g[5]&&g[5]==g[7]) 48 { 49 if(g[3]==1) return 1; 50 if(g[3]==2) return -1; 51 } 52 return 0; 53 } 54 int cnt(int s){int ret=0;for(int i=1;i<=9;i++,s/=3) ret+=(s%3==0); return ret;} 55 int dfs(int s,int who) 56 { 57 if(judge(s)!=0) return judge(s); 58 else if(cnt(s)==0) return judge(s); 59 if(~f[s][who]) return f[s][who]; 60 int mmin=1,mmax=-1; 61 if(who==1) 62 { 63 for(int i=1,ss=s;i<=9;i++,ss/=3) 64 { 65 int t=ss%3; 66 if(t==0) mmax=max(mmax,dfs(s+po[i-1],2)); 67 } 68 return f[s][who]=mmax; 69 } 70 else 71 { 72 for(int i=1,ss=s;i<=9;i++,ss/=3) 73 { 74 int t=ss%3; 75 if(t==0) mmin=min(mmin,dfs(s+po[i-1]*2,1)); 76 } 77 return f[s][who]=mmin; 78 } 79 } 80 int main() 81 { 82 memset(f,-1,sizeof(f)); 83 po[0]=1,ch[‘X‘]=2,ch[‘O‘]=1,ch[‘_‘]=0; 84 for(int i=1;i<=10;i++) po[i]=po[i-1]*3; 85 int T; 86 scanf("%d",&T); 87 while(T--) 88 { 89 int st=0,fc=0,sc=0; 90 char buf[5]; 91 for(int i=1;i<=3;i++) 92 { 93 scanf("%s",buf); 94 for(int j=0;j<3;j++) 95 { 96 st+=ch[buf[j]]*po[(i-1)*3+j]; 97 if(buf[j]==‘O‘) fc++; 98 else if(buf[j]==‘X‘)sc++; 99 } 100 } 101 int win=0; 102 if(fc==sc) win=dfs(st,1); 103 else win=dfs(st,2); 104 printf("%s\n",win==0?"E":win==1?"O":"X"); 105 }
- T2 ?asuchy
- 题面:
-
(BZOJ)3749: [POI2015]?asuchy
Time Limit: 10 Sec Memory Limit: 64 MBSec Special Judge
Submit: 420 Solved: 164
[Submit][Status][Discuss]Description
圆桌上摆放着n份食物,围成一圈,第i份食物所含热量为c[i]。
相邻两份食物之间坐着一个人,共有n个人。每个人有两种选择,吃自己左边或者右边的食物。如果两个人选择了同一份食物,这两个人会平分这份食物,每人获得一半的热量。
假如某个人改变自己的选择后(其他n-1个人的选择不变),可以使自己获得比原先更多的热量,那么这个人会不满意。
请你给每个人指定应该吃哪一份食物,使得所有人都能够满意。
Input
第一行一个整数n(2<=n<=1000000),表示食物的数量(即人数)。食物和人都从1~n编号。
第二行包含n个整数c[1],c[2],…,c[n](1<=c[i]<=10^9)。
假设第i个人(1<=i<n)左边是第i份食物,右边是第i+1份食物;而第n个人左边是第n份食物,右边是第1份食物。
Output
如果不存在这样的方案,仅输出一行NIE。
如果存在这样的方案,输出一行共n个整数,第i个整数表示第i个人选择的食物的编号。如果有多组这样的方案,输出任意一个即可。
Sample Input
5
5 3 7 2 9Sample Output
2 3 3 5 1
- 状态恶心的dp,状态:f[i][j]表示第i个食物处于第j种状态:被左边吃,被右边吃,被两边吃,两边都不吃,转移见code(ps:不存在无解的情况!)话说似乎贪心+随机化之类可以骗到大部分分……多跑几遍说不定就A了……
-
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #define ll long long 5 using namespace std; 6 7 ll n; 8 ll a[1000005]; 9 ll f[1000005][5]; 10 ll ans[1000005]; 11 // 1 left 12 // 2 right 13 // 3 yiqi 14 // 4 doubu 15 16 bool dp(ll v) { 17 memset(f,0,sizeof(f)); 18 f[1][v]=1; 19 for(int i=2; i<=n; i++) { 20 if(f[i-1][1]&&a[i-1]<=2*a[i]) f[i][1]=1; 21 if(f[i-1][1]&&a[i-1]<=a[i]) f[i][3]=1; 22 if(f[i-1][2]&&a[i-1]*2>=a[i]) f[i][2]=2; 23 if(f[i-1][2]&&a[i-1]>=a[i]) f[i][4]=2; 24 if(f[i-1][3]&&a[i-1]>=a[i]*2) f[i][4]=3; 25 if(f[i-1][3]&&a[i-1]>=a[i]) f[i][2]=3; 26 if(f[i-1][4]&&a[i-1]<=a[i]) f[i][1]=4; 27 if(f[i-1][4]&&a[i-1]*2<=a[i]) f[i][3]=4; 28 } 29 if(!f[n][v]) return 0; 30 for(int i=n; i>=1; i--) { 31 if(v==1) ans[i-1]=(i-1)%(n-1)+1; 32 if(v==2) ans[i]=(i-1)%(n-1)+1; 33 if(v==3) ans[i-1]=ans[i]=(i-1)%(n-1)+1; 34 v=f[i][v]; 35 } 36 for(int i=1; i<n; i++) printf("%lld ",ans[i]); 37 return 1; 38 } 39 40 int main() { 41 scanf("%lld",&n); 42 for(int i=1; i<=n; i++) scanf("%lld",&a[i]); 43 a[++n]=a[1]; 44 for(int i=1;i<=4;i++) if(dp(i)) return 0; 45 }
- T3 泰拉瑞亚
- 题意:完成两个操作:单点增加某点的值,快速查找某点左右两边第一个比它值大的点。
- 这道真是毒瘤题……大概思路……分块维护块中单调栈,每个块再用线段树维护单点修改……代码暂无……
原文地址:https://www.cnblogs.com/KatouKatou/p/9520747.html
时间: 2024-11-05 13:04:25