暑假练习记录(四):2017 CCPC Final

4 篇文章 0 订阅
3 篇文章 0 订阅

一,Dogs and Cages

披着数论外皮的水(nan)题(si),狗狗进笼子,进错笼子的狗狗的期望:n-1,打表许能找出规律来???,,,,

#include <bits/stdc++.h>
using namespace std;
int main(){
	int t,n,cas=1;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		double ans=n-1.00;
		printf("Case #%d: %.10lf\n",cas++,ans);
	}
}

二,Same Digit

大佬:不可做题。

蒟蒻瑟瑟发抖(等待补题吧,但愿不是有生之年系列),,,

三,Rich Game

思维题,x>y 时候,羽毛球可以一直打下去,不花钱就能全赢,其余情况,先输一局赚钱,在不停赢,直到没钱,再输

#include <bits/stdc++.h>
using namespace std;
int main(){
	int t;cin>>t;
	for(int cnt=1;cnt<=t;cnt++){
		int x,y,k;
		cin>>x>>y>>k;
		if(x>y){
			printf("Case #%d: %d\n",cnt,k);continue;
		}
		int p=11*x,pp=11*y-9*x;
		int xx=0,ans=0;
		for(int i=1;i<=k;i++){
			if(xx>=pp){
				xx-=pp;ans++;
			}else xx+=p;
		}
		printf("Case #%d: %d\n",cnt,ans);
	}
	return 0;
}

四,Mr. Panda and Circles 

等待补题,,,,,,

五,Evil Forest

真·签到题,记得每个都是1.1倍,加一舍掉小数

#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main(){
	int t,n,cas=1;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		int ans=0;
		for(int i=0;i<n;i++){
			scanf("%d",&a[i]);
			ans+=a[i]+a[i]/10;
			if(a[i]%10)ans++;
		}
		printf("Case #%d: %d\n",cas++,ans);
	}
}

六,Fair Lottery 

等待补题,,,,,,,,

七,Alice’s Stamps

贪(jiu)心(shi)误(wo)我(cai),结果ans = dp[n][k];

#include<cstring>
#include<iostream>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn=2e3+5;
struct node{
	int l,r,len;
}p[maxn];
bool cmp(node a,node b){
	return a.l<b.l;
}
int dp[maxn][maxn];//dp[i][j]表示,从j个集合中可取得1~i编号的邮票的最大值 
int main(){
	int T;scanf("%d",&T);
	for(int t=1;t<=T;t++)
	{
		int n,m,k;
		scanf("%d%d%d",&n,&m,&k);
		memset(dp,0,sizeof dp);
		for(int i=0;i<m;i++){
			scanf("%d%d",&p[i].l,&p[i].r);
			p[i].len=p[i].r-p[i].l+1;
		}
		sort(p,p+m,cmp);
		int pos=0,num=0;
		for(int i=0;i<n;i++){
			//以i+1左端点的集合中取最大值 
			while(pos<m&&p[pos].l==i+1){
				num=max(num,p[pos].len) ;
				pos++;
			} 
			for(int j=0;j<=k;j++){
				dp[i][j+1]=max(dp[i][j],dp[i][j+1]);
				dp[i+1][j]=max(dp[i][j],dp[i+1][j]);
				dp[i+num][j+1]=max(dp[i+num][j+1],dp[i][j]+num); 
			}
			if(num)num--; 
		}
		printf("Case #%d: %d\n",t,dp[n][k]);
	}
}

八,Equidistance 

等待补题,,,,,,

九,Inkopolis

等待补题,,,,,,

十,Subway Chasing

补题,,SPFA加差分约束,还在看最短路专题

#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define endl '\n'
#define sc(x) scanf("%lld",&x)

using namespace std;
const int inf=0xc0c0c0c0;
const int size=2005;
struct Edge{
	int u,v,w;
	Edge(int u=0,int v=0,int w=0):u(u),v(v),w(w){}
};
vector<Edge> edge;
vector<int> No[2005];
int vis[2005];
int dis[2005];
int cnt[2005];
void init(int n)
{
 	fill(dis,dis+n+1,inf);
	memset(vis,0,sizeof(vis));
	memset(cnt,0,sizeof(cnt));
	for(int i=0;i<=n;i++) No[i].clear();
	edge.clear();
}
void addedge(int u,int v,int w)
{
	edge.push_back(Edge(u,v,w));
	No[u].push_back(edge.size()-1);
}
bool spfa(int s,int n)
{
	dis[s]=0;
	queue<int> Q;
	Q.push(s);
	while(!Q.empty())
	{
		int k=Q.front();
		Q.pop();
		vis[k]=0;
		for(int i=0;i<No[k].size();i++)
		{
			int id=No[k][i];
			if(dis[edge[id].v]<dis[k]+edge[id].w)
			{
				dis[edge[id].v]=dis[k]+edge[id].w;
				if(!vis[edge[id].v])
				{
					Q.push(edge[id].v);vis[edge[id].v]=1;
					if(++cnt[edge[id].v]>n) return false;
				}
			}
		}
	}
	return true;
}
int main(){
	int t,cas=1;
	cin>>t;
	while(t--){
		int n,m,x;
		cin>>n>>m>>x;
		init(n+1);
		for(int i=1;i<=n;i++){
			addedge(i-1,i,1);
		}
		for(int i=0;i<m;i++){
			int a,b,c,d,pf=0;
			cin>>a>>b>>c>>d;
			if(a!=b||c!=d)pf=1;
			addedge(c,b,pf-x);
			addedge(a,d,x+pf);			
		}
		printf("Case #%d:",cas++);
		if(!spfa(0,n+1)||dis[n]==inf){
			printf(" IMPOSSIBLE\n");continue;
		}
		for(int i=2;i<=n;i++){
			printf(" %d",dis[i]-dis[i-1]);
		}
		printf("\n");
	}
}

十一,Knightmare 

马走日,无限大的棋盘,跳过N次后,可能的位置数量,打表找规律,我为啥要用dfs,呜呜呜,还有刚好卡掉long long,ull才行

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
int a[10];
int main(){
	int t;scanf("%d",&t);
	a[0]=1;
	a[1]=9;
	a[2]=41;
	a[3]=109;
	a[4]=205;
	a[5]=325;
	a[6]=473;
	for(int cnt=1;cnt<=t;cnt++){
		ll n;cin>>n;
		if(n<=6)printf("Case #%d: %d\n",cnt,a[n]);
		else {
			ull ans=473;
            ll t=n-6;
			ans=ans+148*t;
			ll temp=(t*(t+1))/2;
			ans=ans+28*temp;
			printf("Case #%d: ",cnt);
			cout<<ans<<endl;
		}
	}
}

比赛好像一道完整的都没搞完,抱紧菜菜的自己,,,,,

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值