題目: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;
}