首页 > 代码库 > cf#264 div2
cf#264 div2
没参加,过了好久才补齐:
第一题:好贱的题啊,题意描述不清,水又水得很。
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 using namespace std; 5 int n,s,w[101]; 6 int main(){ 7 scanf("%d%d",&n,&s); 8 s=s*100; 9 int x1,y1,q=1;10 for (int i=1;i<=n;i++){11 scanf("%d%d",&x1,&y1);12 w[i]=x1*100+y1;13 if (w[i]<=s) q=0;14 }15 if (q) {printf("-1\n");return 0;}16 int ans=0;17 for (int i=1;i<=n;i++){18 if (w[i]>s) continue;19 if ((s-w[i])%100>ans) ans=(s-w[i])%100;20 }21 printf("%d\n",ans);22 return 0;23 }
第二题:贪心
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 using namespace std; 5 int n; 6 int h[100010],energy,ans; 7 int main(){ 8 scanf("%d",&n); 9 energy=0;10 for (int i=1;i<=n;i++)11 scanf("%d",&h[i]);12 h[0]=0;13 for (int i=1;i<=n;i++){14 if (energy+h[i-1]<h[i]) {ans+=h[i]-energy-h[i-1];energy=0;}15 else energy-=(h[i]-h[i-1]);16 }17 printf("%d\n",ans);18 return 0;19 }
第三题:还是很水啊,记得用long long
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 int n,x1,y1,x2,y2; 5 long long a[2001][2001],ans1,ans2; 6 long long l[6001],R[6001],*r; 7 int main(){ 8 r=R+3001; 9 ans1=-1;ans2=-1;10 scanf("%d",&n);11 memset(l,0,sizeof(l));12 memset(R,0,sizeof(R));13 for (int i=1;i<=n;i++)14 for (int j=1;j<=n;j++){15 scanf("%I64d",&a[i][j]);16 l[i+j]+=a[i][j];17 r[i-j]+=a[i][j];18 }19 for (int i=1;i<=n;i++)20 for (int j=1;j<=n;j++)21 if ((i+j)%2==0) {22 if (l[i+j]+r[i-j]-a[i][j]>ans1) {ans1=l[i+j]+r[i-j]-a[i][j];x1=i;y1=j;}23 }else {24 if (l[i+j]+r[i-j]-a[i][j]>ans2) {ans2=l[i+j]+r[i-j]-a[i][j];x2=i;y2=j;}25 }26 printf("%I64d\n",(long long )(ans1+ans2));27 printf("%d %d %d %d\n",x1,y1,x2,y2);28 return 0;29 }
第四题:多排列的lcs,动态规划,以其中一个排列为基准,用f[i]表示第一个排列中以i为结尾的最长公共序列,
f[i]=max{f[j]+1} (j<i,且每个排列中a[i],a[j]这两个数对应的顺序相同)最后得出最大的f[i]即可。
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 using namespace std; 5 int a[7][1001]; 6 int pos[7][1001]; 7 int f[1001]; 8 int main(){ 9 int n,T;10 scanf("%d%d",&n,&T);11 memset(f,0,sizeof(f));12 for (int i=1;i<=T;i++){13 for (int j=1;j<=n;j++){14 scanf("%d",&a[i][j]);15 pos[i][a[i][j]]=j;16 }17 }18 for (int i=1;i<=n;i++){19 int Max=0;20 for (int j=1;j<i;j++){21 bool flag=1;22 for (int k=1;k<=T;k++){23 if (pos[k][a[1][j]]>pos[k][a[1][i]]) flag=0;24 }25 if (flag) if (f[j]>Max) Max=f[j];26 }27 f[i]=Max+1;28 }29 int ans=0;30 for (int i=1;i<=n;i++) if (f[i]>ans) ans=f[i];31 printf("%d\n",ans);32 return 0;33 }
第五题:我只会暴力,看了题解之后发现我按照题解的方法写的比暴力跑得还慢,想想算了,数据比较弱,树的深度很小,所以暴力能过。
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <vector> 5 #include <cctype> 6 #define pb push_back 7 using namespace std; 8 int value[100001],fat[100001]; 9 int n,q;10 vector <int> Ed[100001];11 void dfs(int node,int father){12 fat[node]=father;13 for (int i=0;i<Ed[node].size();i++)14 if (Ed[node][i]!=father) dfs(Ed[node][i],node);15 }16 inline int readint(){17 char ch;int ret=0;18 ch=getchar();19 while (!isdigit(ch)) ch=getchar();20 while (isdigit(ch)) {21 ret=ret*10+ch-‘0‘;22 ch=getchar();23 }24 return ret;25 }26 inline int gcd(int a,int b){27 int t;28 while (b!=0){29 t=a;a=b;b=t%b;30 }31 return a;32 }33 int main(){34 n=readint();q=readint();35 for (int i=1;i<=n;i++)36 value[i]=readint();37 int v1,v2;38 for (int i=1;i<=n-1;i++){39 v1=readint();v2=readint();40 Ed[v1].pb(v2);41 Ed[v2].pb(v1);42 }43 dfs(1,-1);44 int kind,x,p,flag;45 while (q--){46 kind=readint();47 if (kind==1) {48 x=readint();p=value[x];flag=1;49 while (fat[x]!=-1) {50 x=fat[x];51 if (gcd(value[x],p)>1) {printf("%d\n",x);flag=0;break;}52 }53 if (flag) printf("-1\n");54 }else {55 x=readint();value[x]=readint();56 }57 }58 return 0;59 }
标解的做法以后再写一遍看看吧。
cf#264 div2
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。