蒜普6

題目:https://www.jisuanke.com/contest/9297/challenges
題解:
第一題80 ——模擬

#include <bits/stdc++.h>
using namespace std;
struct node{
	int pos,len;
}a[10000];
bool cmp(node a,node b){
	return a.pos<b.pos;
}
int main(){
	int n,x0,y0,x,y;
	cin>>n>>x0>>y0>>x>>y;
	for(int i=1;i<=n;i++){
		cin>>a[i].pos>>a[i].len;
	}
	sort(a+1,a+n+1,cmp);
	int dert=0;
	for(int i=1;i<=n;i++){
		dert=a[i].pos-a[i-1].pos;
		x0-=dert;
		y0-=a[i].len;
		if(x0<0 && y0>=y){
			x0+=x;
			y0-=y;
		}else if(y0<0 && x0>=x){
			x0-=x;
			y0+=y;
		}else if(((x0<0 && y0<y) || (x0<x && y0<0)) && i<n){
			cout<<0;
			break;
		}
		
	}
	if(y0>=y){
		x0+=x*(y0/y);
	}
	cout<<1<<endl<<x0;
	
	return 0;
} 

第二題:數據小——回溯
100分

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,x,xt[110],yt[110],wt[110],vis[110][110],ans=0;
int dx[4]={0,1},dy[4]={1,0};
int check(){
	int now=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(vis[i][j]){//有數的點 
				for(int k=0;k<=1;k++)
				{
					int dt=i+dx[k],dq=j+dy[k]; //相鄰的 
					if(vis[dt][dq]){//相鄰且有數 
						now+=x;
					}
				}
			}
		}
	}
	return now;
}
void dfs(int u,int now)
{
	if(u==m+1){//最後一個點 
		ans=max(ans,now-check());// now-check()減去相鄰的 
		return ;
	}
	dfs(u+1,now);
	vis[xt[u]][yt[u]]=1;
	dfs(u+1,now+wt[u]);//算上這個數的值 
	vis[xt[u]][yt[u]]=0;//回溯 
}
signed main()
{
	cin>>n>>m>>x;
	for(int i=1;i<=m;i++)
	{
		scanf("%lld%lld%lld",&xt[i],&yt[i],&wt[i]);
	}
	dfs(1,0);
	cout<<ans;
	return 0;
}

signed main與int main區別

#define ll long long
int main(){
    ll int x;
    scanf("%lld",&x);
}
 
 
 
#define int long long
signed main(){
 
    。。。
}

動規0分

long a[20][20];
    int main(){
        int n,m;
        long x;
         cin>>n>>m>>x;
         for(int i=1;i<=m;i++){
             int x1,y1;
             long xy;
              cin>>x1>>y1>>xy;
              a[x1][y1]=xy;
         }
         for(int i=1;i<=n;i++){
              for(int j=1;j<=n;j++){
                long num=a[i][j];
                a[i][j]=max(a[i-1][j],a[i][j-1]);
            a[i][j]=max(a[i][j],max(a[i-1][j]+num-2,a[i][j-1]+num-2));

               a[i][j]=max(a[i-1][j-1]+num,a[i][j]);

              }
         }
         cout<<a[n][n];
         return 0;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章