日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Educational Codeforces Round 1

發布時間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Educational Codeforces Round 1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

被C坑的不行不行的。。。其他題目都還可以。

A - Tricky Sum

求1,2,3,...,n的加和,其中2^x(x>=0)為負。

因為2^x的個數很少,所以以每個2^x為分界點進行判斷.

初始化x=0;

如果n>2^x,求出2^(x-1)到2^(x)之間的加和,用等差數列求和公式即可,然后x++,

如果n<=2^x,求出2^(x-1)到n之間的加和,然后結束.

#include <iostream> #include <stdio.h> #include <string> #include <string.h> using namespace std;int main(int argc, const char * argv[]) {// insert code here...int T;scanf("%d",&T);while (T--) {int n;scanf( "%d",&n);long long tmp=1;long long sum=0;while(tmp<=n){if( tmp-1 >= tmp/2+1 ){sum += (tmp+tmp/2)*(tmp-tmp/2-1)/2;}sum -= tmp;tmp*=2;}sum += (tmp/2+1+n)*(n-tmp/2)/2;cout<<sum<<endl;}return 0; } A

(感觸:以后寫等差數列求和時寫個函數,方便些)

B - Queries on a String

看懂題目,模擬即可。

#include <iostream> #include <stdio.h> #include <string> #include <string.h> using namespace std;char str[2][10100];int main(int argc, const char * argv[]) {// insert code here...scanf("%s",str[0]);int m;scanf("%d",&m);int a=0,b=1;for (int i=0;i<m; i++) {int l,r,k;scanf("%d%d%d",&l,&r,&k);l--;r--;int tlen=(r-l+1);k%=tlen;strcpy(str[b],str[a]);for(int j=l;j<=r;j++){str[b][l+ (j-l+k)%tlen ]=str[a][j];}swap(a,b);//printf("%s\n",str[a]); }printf("%s\n",str[a]);return 0; } B

C - Nearest vectors

這題可以看這里,里面有我寫這題的崎嶇之路。

D - Igor In the Museum

很裸的BFS。 不同的是,到一個格點,搜索一下周圍四個方向上墻的個數。

#include <iostream> #include <stdio.h> #include <string> #include <math.h> #include <algorithm> #include <string.h> using namespace std;int n,m,k; char g[1010][1010]; int mark[1010][1010]; int id;struct node {int x,y; }que[1001000];int qf,qd; int save[1001000]; int up[4]={1,-1,0,0}; int rl[4]={0,0,1,-1};void bfs(int x,int y) {qf=qd=0;node fi;fi.x=x;fi.y=y;int cnt=0;que[qf++]=fi;mark[x][y]=id;while(qf>qd){node cur=que[qd++];for(int i=0;i<4;i++){int tx=cur.x+up[i];int ty=cur.y+rl[i];if( tx>=0&&tx<n &&ty>=0&&ty<m ){if(g[tx][ty]=='.'&&mark[tx][ty]==-1 ){mark[tx][ty]=id;node newnode;newnode.x=tx;newnode.y=ty;que[qf++]=newnode;}else if(g[tx][ty]=='*') cnt++;}}}save[id]=cnt;id++; }int main(int argc, const char * argv[]) {// insert code here...scanf("%d%d%d",&n,&m,&k);for(int i=0;i<n;i++)scanf("%s",g[i]);id=0;memset(mark,-1,sizeof(mark));for(int i=0;i<n;i++)for(int j=0;j<m;j++){if( mark[i][j] ==-1 && g[i][j] == '.' ){bfs(i,j);}}for(int i=0;i<k;i++){int x,y;scanf("%d%d",&x,&y);x--;y--;printf("%d\n",save[ mark[x][y] ]);}return 0; } D

E - Chocolate Bar

DP.

狀態:

dp[i][j][k] 表示高為i,寬為j的巧克力被分成能拼成k的最小花費。

轉移:

考慮每一種橫著切和豎著切的情況。具體看代碼。

?

#include <iostream> #include <stdio.h> #include <string> #include <math.h> #include <algorithm> #include <string.h> using namespace std; #define INF 100000000 int dp[33][33][55];int main(int argc, const char * argv[]) {dp[1][1][1]=0;memset(dp,0,sizeof(dp));for(int i=1;i<=30;i++)for(int j=1;j<=30;j++)for(int k=1;k<=50;k++)dp[i][j][k]=INF;dp[1][1][1]=0;for(int i=1;i<=30;i++)for(int j=1;j<=30;j++){if(i==j&&i==1) continue;for(int k=1;k<=min(i*j,50);k++){if(i*j==k){dp[i][j][k]=0;continue;}int mi=INF;for(int i1=1;i1<i;i1++){if( i1*j <= k) mi=min(mi,dp[(i-i1)][j][k-i1*j]+j*j);if( (i-i1)*j <= k ) mi=min(mi,dp[i1][j][k-(i-i1)*j]+j*j);if( i1*j >= k) mi=min(mi,dp[i1][j][k]+j*j);if( (i-i1)*j >=k ) mi=min(mi,dp[i-i1][j][k]+j*j);}for(int j1=1;j1<j;j1++){if( j1*i <= k ) mi=min(mi,dp[i][j-j1][k-j1*i]+i*i);if( (j-j1)*i <=k ) mi=min(mi,dp[i][j1][k-(j-j1)*i]+i*i);if( j1*i >= k) mi=min(mi,dp[i][j1][k]+i*i);if( (j-j1)*i >=k ) mi=min(mi,dp[i][j-j1][k]+i*i);}//有四種情況 dp[i][j][k]=mi;}}int n;scanf("%d",&n);while(n--){int x,y,z;scanf("%d%d%d",&x,&y,&z);printf("%d\n",dp[x][y][z]);}return 0; } E

?

轉載于:https://www.cnblogs.com/chenhuan001/p/4963944.html

總結

以上是生活随笔為你收集整理的Educational Codeforces Round 1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。