UCF Locals 2015(A~H)

cf題目鏈接

計蒜客題目鏈接

注意cf和計蒜客的輸出格式是不一樣的,我在cf能A的,就沒去計蒜客驗證了

A-Find the Twins

水題 注意輸出格式就行了。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=12;
int a[N],n;
int main()
{
	int _;cin>>_;while(_--)
	{
	    n=10;
	    int f=0,f1=0;
	    for(int i=1;i<=10;++i){
            int x;
            scanf("%d",&x);
            if(x==17) f=1;
            if(x==18) f1=1;
            a[i]=x;
	    }
	    rep(i,1,10) {
            if(i==1) printf("%d",a[i]);
            else printf(" %d",a[i]);
	    }
	    puts("");
	    if(f&&f1) puts("both");
	    else if(!f&&f1) puts("mack");
	    else if(f&&!f1) puts("zack");
	    else puts("none");
	    puts("");
	}
}

 

 

B-Medal Ranking

還是簽到題,注意輸出格式即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=12;
int a[N],n;
int main()
{
	int _;cin>>_;while(_--)
	{
	    int a,b,c;
	    int x,y,z;
	    scanf("%d%d%d%d%d%d",&a,&b,&c,&x,&y,&z);
	    int f=0,f1=0;
	    if(a+b+c>x+y+z) f=1;
	    if(a>x||a==x&&b>y||a==x&&b==y&&c>z) f1=1;
	    printf("%d %d %d %d %d %d\n",a,b,c,x,y,z);
	    if(f&f1) puts("both");
	    else if(f) puts("count");
	    else if(f1) puts("color");
	    else puts("none");
	    puts("");
	}
}

C-Brownies vs. Candies vs. Cookies

模擬題 ,看懂題意模擬一下就可以了

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=1e5+10;
int a[N],n;
int main()
{
    int cas=0;
	int _;cin>>_;while(_--)
	{
	    int d,ans;

	    scanf("%d%d",&d,&ans);
	    int t=ans;
	    int m;
	    scanf("%d",&m);
	    for(int i=1;i<=m;++i){
            scanf("%d",&a[i]);
	    }
	    printf("Practice #%d: %d %d\n",++cas,d,t);
	    for(int i=1;i<=m;++i){
            if(ans-a[i]>0){
                ans-=a[i];
            }
            else{
                while(ans-a[i]<=0) ans=2*ans;
                ans-=a[i];
            }
            printf("%d %d\n",a[i],ans);

	    }
	    puts("");
	}
}

D-Lemonade Stand

水題,模擬一下即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=1e3+10;
ll n,d,x;
struct node
{
    ll c,pl,ps;
}a[N];
ll sum[N],dp1[N];
int main()
{
    int cas=0;
	int _;cin>>_;
	for(int kk=1;kk<=_;++kk)
	{
	    scanf("%d%d%d",&n,&d,&x);
	    for(int i=1;i<=n;++i){
            scanf("%lld%lld%lld",&a[i].c,&a[i].pl,&a[i].ps);
            sum[i]=sum[i-1]+a[i].c;
            dp1[i]=(1ll<<62);
	    }

	    for(int i=1;i<=n;++i){
            for(int j=1;j<=i;++j){
                ll t=sum[i]-sum[j-1];
                t=t*d;
                t=t*a[j].pl;
                dp1[i]=min(dp1[i],t+dp1[j-1]);
            }
        }

//        rep(i,0,n){
//            printf("i:%d dp:%lld\n",i,dp1[i]);
//        }
        ll to=0;
        ll ans=0;
        int j;
        for(int i=1;i<=n;)
        {
            for(j=i+1;j<=n;++j){
                if(a[j].ps<a[i].ps){
                    break;
                }
            }
            --j;
            ll s=sum[j]-sum[i-1];
            s=s*x;//需要的蠱司

            ll t1=0;
            while(to<s){
                to+=80;
                t1++;
            }

            ans+=t1*a[i].ps;//價格
            to=to-s;
            i=j+1;
        }
        //printf("%lld %lld %lld\n",dp1[n],ans,dp1[n]+ans);
        if(kk!=_) printf("%lld\n",dp1[n]+ans);
        else printf("%lld",dp1[n]+ans);
	}

E-Rain Gauge

這題 有一個不錯的博客,有圖:https://blog.csdn.net/qq_45900709/article/details/103340154

#include<stdio.h>
#include<math.h>
#define pi 3.14159265358979 
int main()
{
     int n;
     double s,r;
     scanf("%d",&n);
     while(n--)
     {
          scanf("%lf%lf",&s,&r);
          if(s>=2*r)printf("%.2lf\n",pi*r*r);
          else if(2*r>=sqrt(2*s*s))printf("%.2lf\n",s*s);
          else
          {
               double angle,sector,triangle;
               angle=acos(s/2/r);
              sector=2*angle*r*r/2;
              triangle=r*r*sin(2*angle)/2;
              printf("%.2lf\n",pi*r*r-4*(sector-triangle));
          }
     }
}

F-Balanced Strings

從這題開始纔有點質量了。

題意:給你一個字符串,?  代表 你可以填字母,要求所有長度爲偶數的子串  中的元音字符等於輔音字符,這裏設 y也爲元音

做法:仔細想想就知道是 元輔 交叉才符合題目

設dp[i][0]爲當前位置爲元音字母時的方案數

設dp[i][1]爲當前位置爲輔音字母時的方案數

dp一下即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e2+10;
char s[N];
int n;
ll dp[N][2];
bool check(char c)
{
    if(c=='a'||c=='o'||c=='e'||c=='i'||c=='u'||c=='y') return 1;
    return 0;
}
int main()
{
    int cas=0;
    int _;cin>>_;while(_--)
    {
        scanf("%s",s+1);
        n=strlen(s+1);
        dp[0][0]=dp[0][1]=1;
        for(int i=1;i<=n;++i){
            if(s[i]=='?'){
                dp[i][0]=1ll*6*dp[i-1][1];
                dp[i][1]=1ll*20*dp[i-1][0];
            }
            else{
                dp[i][0]=dp[i][1]=0;
                if(check(s[i])) dp[i][0]=dp[i-1][1];
                else dp[i][1]=dp[i-1][0];
            }
        }
        printf("String #%d: ",++cas);
        printf("%lld\n",dp[n][0]+dp[n][1]);
        puts("");
    }
}
/*
7
orooji
al?
a?i
g?ha
a?u?
?????????????????
arup
 */

G-Towers of Hanoi Grid

題意:輸入d,n 代表n*n的矩陣地圖。(1,1)位置有d個 的漢諾塔,每次只能走x+1  或y+1的格子。問最少幾步把漢諾塔移到(n,n)

做法:我們都知道,三個柱子才能使得漢諾塔進行移動,那麼這題不存在有三個柱子可以互相到達。

那麼點撥了一個思路:除了最後一個大得,上面小的分佈在(n-1)*(n-1)上,最好留出一行一列給最後一個大的走到(n,n);

那麼只需要判斷(n-1)*(n-1)與d-1的大小 即可,然後答案就是d個曼哈頓距離 d*(n-1+n-1)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
	int t;
	cin>>t;
	int cas=0;
	while(t--){
		ll a, b;
		cin>>a>>b;
		ll mx = (b*b - 2*b + 2);
		printf("Grid #%d: ",++cas);
		if(a<=mx) printf("%lld\n",a*(2*b-2));
		else puts("impossible");
		puts("");
	}
}

H-Reach for the Stars

題意:輸入n*m的字符矩陣,每次可以用十字型的蓋章對#進行覆蓋,只能覆蓋#部分,問最少使用幾次十字印章才能將所有的 # 字符都至少覆蓋一次。

做法:以爲是簡單的判斷一下,沒想到一直wa,由於n<=9 而且時間是2.5s  很顯然,這題需要DFS爆搜。

枚舉十字印章中間那麼點所在的位置 遞歸回溯一下 能否全部覆蓋,然後加了很多很多剪枝才過的。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

char Map[10][10];
int T,N,M,Ans,Case=0;

void DFS(int i,int j,int Step,int Count){
    printf("i:%d j:%d\n",i,j);
    if(Step>=Ans) return;//常見剪枝
    if(Count==0){Ans=min(Ans,Step);return;}
    if(i==1 || i>=N || j==1 || j>=M) return;

    if((Count-1)/5+1+Step>=Ans) return;//優化1

    char temp[5];
    int Cnt=0;
	bool flag=false;

    temp[0]=Map[i][j];
    temp[1]=Map[i-1][j];
	temp[2]=Map[i+1][j];
    temp[3]=Map[i][j-1];
	temp[4]=Map[i][j+1];
    for(register int k=0;k<5;++k){
        if(temp[k]=='#') ++Cnt;
        if(temp[k]=='.'){flag=true;break;}
    }
    if(!flag && Cnt){
        Map[i][j]=Map[i-1][j]=Map[i+1][j]=Map[i][j-1]=Map[i][j+1]='@';
        if(j+1<M) DFS(i,j+1,Step+1,Count-Cnt);//遞歸回溯下
        else DFS(i+1,2,Step+1,Count-Cnt);
        Map[i][j]=temp[0];
        Map[i-1][j]=temp[1];
		Map[i+1][j]=temp[2];
        Map[i][j-1]=temp[3];
		Map[i][j+1]=temp[4];
    }
    if(i==2 && Map[1][j]=='#') return;//優化2 這四種情況沒必要進行後面的遞歸回溯了
    if(j==2 && Map[i][1]=='#') return;
    if(i==N-1 && Map[N][j]=='#') return;
    if(j==M-1 && Map[i][M]=='#') return;

    if(j+1<M) DFS(i,j+1,Step,Count);
    else DFS(i+1,2,Step,Count);
    return;
}

int main(){
    ios::sync_with_stdio(false);
    cin>>T;
    while(T--){
        ++Case;
        cout<<"Image #"<<Case<<": ";
        cin>>N>>M;
        Ans=2147483647;
        int Count=0;
        for(register int i=1;i<=N;++i){
            for(register int j=1;j<=M;++j){
                cin>>Map[i][j];
                if(Map[i][j]=='#') ++Count;
            }
        }
        if(Map[1][1]=='#'||Map[1][M]=='#'||Map[N][1]=='#'||Map[N][M]=='#'){
            cout<<"impossible"<<endl;
            continue;
        }
        DFS(2,2,0,Count);
        if(Ans==2147483647) cout<<"impossible"<<endl;
        else cout<<Ans<<endl;
        cout<<endl;
        //puts("")
    }

    return 0;
}
/*
9 6
.##...
####..
.##...
......
......
......
.#....
###...
.#....
*/

 

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